皆さんは同じスクリプトへのリンクを貼る時、どの様に記述していますか? $_SERVER['PHP_SELF']を用いることがあるのではないでしょうか。これを直接用 いることは危険です。なぜならば、$_SERVER['PHP_SELF']にはクロスサイト・ス クリプティング(XSS)脆弱性が存在するからです。

$_SERVER['PHP_SELF']はしばしば次のように使われます。

<form method="post" action="<?php echo $_SERVER['PHP_SELF'?>">

このページ(ここではhttp:/www.example.jp/example.php)へ下記の様にリンク を貼り、クリックしてみて下さい。

<a href="http://www.example.jp/
example.php/%22%3E%3Cscript%3Ealert(%27XSS%27);%3C/script%3E/">

JavaScriptが実行され、アラートでXSSと表示されたと思います。なぜこのよう なことが起こるのでしょうか?これは$_SERVER ['PHP_SELF']の本質に関わって くる問題です。

$_SERVER['PHP_SELF']は渡されたURIのHOST部分の後から、GETクエリ部分の前ま で(ここには記述していませんが、一般的には?id=10&type=0などの?の前まで) をURLデコードした形で格納します。つまり上記の場合、$_SERVER ['PHP_SELF']は

/example.php/"><script>alert('XSS')</script>/

となります。この結果、formタグ内のaction属性値にそのまま表示されると、 JavaScriptを実行してしまいます。

これを防ぐ方法は、$_SERVER['PHP_SELF']をhtmlspecialcharsでエスケープする ことです。また、CGI版以外では$ _SERVER['PHP_SELF']の代わりに$_SERVER ['SCRIPT_NAME']を用いることも可能です。もしくは、formタグ内の action属性 値を空にしてもいいでしょう。

同様の脆弱性が$_SERVER['PATH_INFO']と$_SERVER['PATH_TRANSLATED']にも存在 します。お気を付け下さい。


(アシアル 井川数志)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。