$_SERVER['PHP_SELF']は危険?

PHPで自ページから自ページへ遷移する動作をさせるとき、AタグやFORMタグに$_SERVER['PHP_SELF']を使う方法があります。

Aタグに使う場合

<a href="<?php echo $_SERVER['PHP_SELF']; ?>">

FORMタグに使う場合

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

しかしこのような目的で$_SERVER['PHP_SELF']を使うときには気をつけたほうがいいです。
XSS(クロスサイトスクリプティング)というセキュリティーホールになります。

CakePHPやZend Frameworkなどmod_rewriteを使っているときです。

例えば次のようなURL

http://example.com/hoge.php/"><script>alert('test');</script><"

このURLの後半をURLエンコードしたURL

http://example.com/hoge.php/%22%3E%3Cscript%3Ealert('test');%3C/script%3E%3C%22

このURLでアクセスすると$_SERVER['PHP_SELF']は

/hoge.php/"><script>alert('test');</script><"

となります。

これを先ほどのAタグに渡してしまうと

<a href="/hoge.php/"><script>alert('test');</script><"">

このようになり、JavaScriptを実行することができます。

同様に先ほどのFORMタグに渡してしまうと

<form method="post" action="/hoge.php/"><script>alert('test');</script><"">

このようになり、これもJavaScriptを実行することができます。

対処法

$_SERVER['SCRIPT_NAME']を使う

$_SERVER['PHP_SELF']は、.php以降のPATH_INFOまで入っていますが、$_SERVER['SCRIPT_NAME']だと、.phpまでしか入っていません。

Aタグに使う場合

<a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>">

FORMタグに使う場合

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

そもそも表示させない

そもそも渡された値をそのまま表示させるのが問題になるということから、自ページから自ページへの遷移なら

Aタグに使う場合

<a href="">

FORMタグに使う場合

<form method="post" action="">

このようにURLに何も書かないことで、$_SERVER['PHP_SELF']とほぼ同じ動作になります。

filter拡張モジュールを使う

PHP5.2.0以降デフォルトで追加された、filter拡張モジュールを使う方法があります。

PHPのfilterモジュールでサニタイズしてみると

Aタグに使う場合

<a href="<?php echo(filter_input(INPUT_SERVER, 'PHP_SELF',FILTER_SANITIZE_STRIPPED)); ?>">

FORMタグに使う場合

<form method="post" action="<?php echo(filter_input(INPUT_SERVER, 'PHP_SELF',FILTER_SANITIZE_STRIPPED)); ?>">

表示は次のようになります。

<a href="/dev/php/SCRIPT_NAME.php/&#34;alert(&#039;test&#039;);">

既存ソースの修正

今まで$_SERVER['PHP_SELF']を使っていた人で、$_SERVER['SCRIPT_NAME']に書き直したいと思ってる場合には、 ファイルからコードを探していくのは大変ですし、漏れがあるかもしれません。

そんなときはコマンドラインから次のコマンドを実行すると、サーバー内からすべて探してくれます。

find 【ディレクトリパス】 -name "*.【拡張子】" -exec fgrep 【検索文字】 {} \;

使用例

find . -name "*.php" -exec fgrep PHP_SELF {} \;

関連記事

スポンサーリンク

Webからダウンロードして保存する DefaultHttpClientの使用例

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る