| « Wikiのフロントページの訪問者数が1万目前 | RIMが特許紛争に勝つ » |
PHP_SELFはそのまま出力できない
時々見かけるのでブログでも問題を指摘します。
PHPの$_SERVER配列に入っているPHP_SELF要素はPATHINFOも含めてしまうため、そのまま出力するとXSSに脆弱になる場合があります。
phpinfo()がXSSに脆弱だ、と指摘する人がいるので(元々phpinfo()の出力は管理者・開発者のみ参照できるようにしておくべきですが..)現在のPHPはPHP_SELF内の< > を検出して
<script> </script>
等と書けないようになっています。しかし、この対策はphpinfo()の事しか考えていないので
<?php
echo '<a href="'. $_SERVER['PHP_SELF'] .'">aaa</a>';
?>
の様なケースの場合、
http://example.com/xss.php/%22%20onMouseOver=%22javascript:alert('xss');
等としてJavaScriptの挿入が可能になります。
SCRIPT_NAMEにはPATH情報が無いのでこの問題は発生しません。PHP_SELFでは無くSCRIPT_NAMEを使用すべき所をPHP_SELFを利用しているケースは時々見かけます。
注意が必要かもしれませんね。
UNIX系OSならPHPのソースがあるディレクトリに移動して
find . -name "*.php" | xargs grep -n "PHP_SELF"
等として怪しいPHP_SELFの出力が無いか確認すると良いかも?!
8 コメント
PHP的にはphpinfoのPHP_SELFで< >を書けないようにするのではなく、htmlentitiesでエンティティ変換するだけで十分と思います。何故こうなったのか記憶にありません。
2006/02/28 @ 01:46
サンプルスクリプトにはPHP_SELFを使っている例が多いのであまり気にせず使われているような気がします。
少し前に日本サイトのリファラスパムがこのブログにも来ている、と書きましたがその時にリファラスパムに利用されている可能性がPHPスクリプトを見つけて中身を見てみるとPHP_SELFだった、という感じです。
実際に多いか?は不明です。
少し前に日本サイトのリファラスパムがこのブログにも来ている、と書きましたがその時にリファラスパムに利用されている可能性がPHPスクリプトを見つけて中身を見てみるとPHP_SELFだった、という感じです。
実際に多いか?は不明です。
2006/02/28 @ 15:19
PHP_SELFの使い方の間違いの他に、割とよく見る間違いにはhtmlentities, htmlspecialcharsの使い方が間違っているケースがあります。エンコーディングは省略したとしても、最低限
htmlentities($str, ENT_QUOTES);
htmspecialchars($str, ENT_QUOTES);
としないとXSSが可能になる場合があります。
ブログじゃなくてWikiにまとめた方が役立つかも知れませんね。
htmlentities($str, ENT_QUOTES);
htmspecialchars($str, ENT_QUOTES);
としないとXSSが可能になる場合があります。
ブログじゃなくてWikiにまとめた方が役立つかも知れませんね。
2006/02/28 @ 15:23
色々あるのですが、よく見かける間違いはPOSIX正規表現関数の利用方法です。
ereg/eregi等はバイナリセーフではありません。
つまり、\0があると文字列の終端として取り扱います。この仕様を知らずにereg/eregi等を利用していると様々なセキュリティホールを作る可能性があります。
この手のTipsはやはりWikiにまとめる方が良いかな?
ereg/eregi等はバイナリセーフではありません。
つまり、\0があると文字列の終端として取り扱います。この仕様を知らずにereg/eregi等を利用していると様々なセキュリティホールを作る可能性があります。
この手のTipsはやはりWikiにまとめる方が良いかな?
2006/03/01 @ 01:21
コメント from: tk [訪問者]
こんにちは。
htmspecialchars($str, ENT_QUOTES);
じゃなくて、
htmspecialchars($str);
で終わらせてしまった場合の、
問題例が非常に欲しいです!!
htmspecialchars($str, ENT_QUOTES);
じゃなくて、
htmspecialchars($str);
で終わらせてしまった場合の、
問題例が非常に欲しいです!!
2006/03/23 @ 14:22
2006/03/23 @ 15:32
コメント from: youhei [訪問者]
PHP_SELFの変わりに使うのは、SCRIPT_FILENAMEじゃなくて、SCRIPT_NAMEじゃないですか?SCRIPT_FILENAMEはサーバ上のパスになる気がします。
2006/06/27 @ 13:01
確かにそうですね。ブログはさらっと書いているので簡単な間違いもあるのでまた見つけたらよろしくお願いします。
2006/06/27 @ 14:11