$_POSTが変更できてしまっていいか?
$_POSTが設定できるということは、ブラウザからHTTP経由でなくても、POSTデータを設定してスクリプトが実行できる。Apacheのアクセスログからは検出できないことになる。セキュリティ的にはいいのかな?何らかの方法でファイルをサーバ内に作成されてしまったような場合など(外部からのHTTPでの攻撃よりは危険性は低いかもしれない)。includeされたほうのファイルが、同じディレクトリからのincludeでなければエラーとするというようなことはできるのかな?
マニュアルを見ると、
- safe_mode=onだとuidのチェックはされるみたいだ。
- open_basedirで使用するディレクトリを制限することができるようだ。
こんなページも見つけた。
- PHP と Web アプリケーションのセキュリティについてのメモ
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html#PHP_include
上位ディレクトリを入力される攻撃(ディレクトリ・トラバーサル攻撃)を回避するための対策として、以下のような対策を勧めるようなページを見かけたことがあるのですが、以下の方法では対策になりません。
$file = str_replace( '../', '', $_GET['file'] );
例えば、以下のようにして試してみれば分かりますが、上の対処方法では、無意味であることが分かります。
$_GET['file'] = '....//....//....//etc/passwd';
echo str_replace( '../', '', $_GET['file'] );上の結果は以下のようになります。
../../../etc/passwd
確かに、
$file = $_GET['file']; do $file = str_replace( '../', '', $file); while (strstr('../', $file));
みたいにしないといけないのかな。