追記:現在のPHPでは$_SERVER[‘PHP_SELF’]はクエリ文字列(?以降のクエリパラメータ)を含みません。しかし、index.php/<script>alert(1)</script>/aaa/bbb とすることは可能です。PHP_SELFと同様の変数は以下です。
- $_SERVER[‘PATH_INFO’]
- $_SERVER[‘PATH_TRANSLATED’]
時々見かけるのでブログでも問題を指摘します。
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の出力が無いか確認すると良いかも?!