$_SERVER['PHP_SELF']の脆弱性

PHPのページで同一のページに遷移する場合、よく使われる手法でフォームのaction属性に以下の様な形で$_SERVER['PHP_SELF']の値を入れる事があります。

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

しかし、この手法の場合、セキュリティ的に問題があり、XSS(クロスサイト・スクリプティング)脆弱性が存在します。

$_SERVER['PHP_SELF']はURLのHOST部分の後ろ以降(?以降のGET変数部分)が出力されるようになってしまいます。
例えば

<?php
echo '<p>$_SERVER["PHP_SELF"] : '.$_SERVER["PHP_SELF"];
echo '<p>$_SERVER["SCRIPT_NAME"] : '.$_SERVER["SCRIPT_NAME"];
?>

のファイルを作成してhttp://localhost/test.phpにアクセスすると、

と、問題なく表示されますが、http://localhost/test.php/hogehogeでアクセスすると、

と、このようになっています。
これだとscriptタグを埋め込むことが出来るため、外部からJavaScriptを実行させることが出来るのです。

対策としては、上記のように$ _SERVER['PHP_SELF']の代わりに$_SERVER['SCRIPT_NAME']を使用する。$_SERVER['SCRIPT_NAME']はURLの?以降が含まれません。
もしくは、フォームのaction属性を空にしておくかです。