PHP 5.
- Paths with NULL in them (foo\0bar.
txt) are now considered as invalid. (Rasmus)
パスに
仕様変更の必要性
PHP本体はC言語で記述されているため,
このPHP言語とC言語の文字列型変数の仕様の違いにより,
サンプルコード1
<?php
// 拡張子をチェックしてpngファイルを送信する
if (preg_match('|\.png$|', $_GET['png_file'])) {
echo readfile($_GET['png_file']);
}
?>
サンプルコード1には2つの問題があります。一つは
少なくとも
preg_
match('|\.png$|', $_GET['png_ file']))
この行で拡張子をチェックしようとしていますが,
<?php
var_dump( preg_match('|\.png$|', "../../../etc/passwd\0.png"));
?>
このコードはint(1)を返し,
http://
example. com/ get_ image. php?..%2F..%2F..%2Fetc%2Fpasswd%00. png
のようにアクセスすると,
http://
example. com/ get_ image. php?%2Fetc%2Fpasswd%00. png
としてUNIX系OSのパスワードファイルを取得できてしまいます。
今までのPHPの防御
PHP 5.
- safe_
mode - open_
basedir
セーフモード
オープンベースディレクトリ
open_
basedir=/var/ www/ php-application
のように設定していれば,
- 注意
PHPのファイル関数からアクセスできなくするだけで,
データベースなどからシステム上のファイルにアクセスすることは可能です。open_ basedirもsafe_ modeと同様, 問題が発生した場合の影響範囲を制限するフェイルセーフ対策です。