2008年4月23日水曜日

 

【Perl】HTML エスケープとXSS対策

フォームの値チェック(バリデーション)を Perl でどうするのかなぁと調べた。
することはおなじみの「<>&amp;"e;'」を変換して無効化すること。

Perl で HTML エスケープ - Landscape - エンジニアのメモ


# HTML エスケープする
 sub HtmlEscape {
  my $content = $_[0];
  my $eucpre = qr{(?<!\x8F)};
  my $eucpost = qr{ (?= (?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
                                     (?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
                                )
                          }x;
  my @escape_from = qw(& > < " ');
  my @escape_to = ('&amp;', '&gt;', '&lt;', '&quot;', '&#39;');
  for (my $i = 0; $i <= $#escape_from; $i++) {
     $content =~ s/$eucpre\Q$escape_from[$i]\E$eucpost/$escape_to[$i]/g;
  }
  return $content;
}

HTML(タグ)を表示する、XSS対策を行う - CGI・Perl例文集


# HTML
my $html = qq|<script language="JavaScript">alert('にょろ');</script>\n|; 

# 関数 xss()  
print xss($html);

sub xss {
 my $str = shift || return(undef);
 $str =~ s/&/&amp;/g;
 $str =~ s/</&lt;/g;
 $str =~ s/>/&gt;/g;
 $str =~ s/\"/&quot;/g;
 $str =~ s/\'/&#39;/g; return($str);
}

# CGIモジュールを利用
use CGI qw(:cgi);
print CGI::escapeHTML($html);

PHP の htmlentities() みたいなのはないのかな。
いつも問題になるのは PHP だけど Perl は問題ないのか、すでに議論し尽くされた問題なのか、PHPer のモラルが低いせいか。
Perl について知らないけど、PHP は言語上欠陥があるとかセキュリティ関係が手薄な入門書があったりはするようだが。

参考

[1-2.] クロスサイトスクリプティング - IPA ISEC セキュア・プログラミング講座
セキュアプログラミング講座 - 情報処理推進機構:情報セキュリティ

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google