11 August 2013

(php, perl) 環境変数一覧表示での文字列除染

環境変数文字列に(HTML構文上)不正な文字が入っている、つまり汚染されているかもしれないということで…

perl版 環境変数表示の除染前
#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
 
print "Content-type: text/html\n\n";
 
print "<html>\n".
        "<head>\n".
        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n".
        "</head>\n".
        "<body>\n".
        "<pre>\n";
 
foreach(sort keys %ENV)
{
    my $str = $_;
    print $str . " : " . $ENV{"$str"} . "\n";
}
 
print "</pre>\n".
    "</body>\n</html>\n";

環境変数を画面出力する部分に、HTML::Entities::encode_entitiesを挿入することで除染できる。

perl版 環境変数表示の除染後
#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use HTML::Entities;
 
print "Content-type: text/html\n\n";
 
print "<html>\n".
        "<head>\n".
        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n".
        "</head>\n".
        "<body>\n".
        "<pre>\n";
 
foreach(sort keys %ENV)
{
    my $str = $_;
    print HTML::Entities::encode_entities($str) . " : " . HTML::Entities::encode_entities($ENV{"$str"}) . "\n";
}
 
print "</pre>\n".
    "</body>\n</html>\n";

次に、PHPの場合は

php版 環境変数表示の除染前
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
print("<p>\$_SERVER :</p>\n<pre>\n");
print_r($_SERVER);
print("</pre>\n");
 
print("<p>\$_ENV :</p>\n<pre>\n");
print_r($_ENV);
print("</pre>\n");
 
?>
</body>
</html>

print_r関数の第2引数にtrueを指定して、一旦文字列に出力し、それを除染する。

php版 環境変数表示の除染後
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
print("<p>\$_SERVER :</p>\n<pre>\n");
print htmlspecialchars(print_r($_SERVER, true), ENT_QUOTES);
print("</pre>\n");
 
print("<p>\$_ENV :</p>\n<pre>\n");
print htmlspecialchars(print_r($_ENV, true), ENT_QUOTES);
print("</pre>\n");
 
?>
</body>
</html>