PHP_SELFとかSCRIPT_NAMEとか

$_SERVER['PHP_SELF'] がそのままではXSS脆弱性になってしまうのは有名な話。
それはここでは割愛。
ただ、いずれにしても $_SERVER なり、$_GETでもセッションとかでも利用する時はいつでも危険だと思って確認は必要だと思う。

それは置いといて、
$_GETも含めたパスを継承する方法を考えてみた。
もっと頭いいやり方あるかもしれないけど。。。とりあえず。

$get = '';
foreach($_GET as $key => $value){
if(!$get){
$get .= '?';
}else{
$get .= '&';
}
$get .= h($key) . '=' . h($value);
}

echo $_SERVER['SCRIPT_NAME'] . $get;
echo '
';
echo h($_SERVER['PHP_SELF']) . $get;

※関数 h に関しては、htmlspecialcharsを別途定義する前提で。
http://d.hatena.ne.jp/kou32rr/20081013/1223878140

とりあえずこれで$_GET含めたパスを取得できる。
$_SERVER['SCRIPT_NAME']だとサーバによってエラー出るみたいで嫌だから、
h($_SERVER['PHP_SELF'])でいこうかなと検討中。