HTMLを文字列として表示する - Perl,CGI

例えば文字列中にHTMLが含まれる場合、それをHTMLではなくタダの文字として表示したい場合がある。このような時にはHTMLの仕様で定められている文字実体参照などへ変換してやれば良い。

原理は非常にシンプルだ。単純に以下の文字列に置き換えてやれば良い。

変換前 変換後
& &
< <
> >
" "
' '

これを行うことで、タグ使用不可の掲示板が作成できたり、XSS(クロスサイトスクリプティング)対策にも活用できる。

サンプル

;#
;#HTML(タグ)を表示する、XSS対策を行いたい
;#

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

#-------------------------------------------------#
#変換+表示
#-------------------------------------------------#
#-- オリジナル関数 --#
print xss($html);

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

#-------------------------------------------------#
#XSS対策
#-------------------------------------------------#
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);
}

実行結果

&lt;script language=&quot;JavaScript&quot;&gt;alert(&#39;にょろ&#39;);&lt;/script&gt;

ここではオリジナルの関数とCGIモジュールの機能の両方を試してみたが、場合によって好きな方を使えば良い。結果はどちらも同じだ。