Null バイト関連の問題
PHP はファイルシステム関連の操作に C 言語の関数を使用しているので、 null バイトの処理を予期せぬかたちで行うことがあります。 C 言語では null バイトは文字列の終端を表すので、 null バイトを含む文字列があった場合に null バイト以降の内容は文字列として処理されません。 以下に、この問題に関する脆弱性を含むコード例を示します。
例1 null バイトに対して脆弱なスクリプト
<?php$file = $_GET['file']; // ここで "../../etc/passwd\0" が渡されたとしますif (file_exists('/home/wwwrun/'.$file.'.php')) { // file_exists は true を返します。これは、ファイル /home/wwwrun/../../etc/passwd が存在するからです include '/home/wwwrun/'.$file.'.php'; // ファイル /etc/passwd がインクルードされてしまいます}?>
したがって、ファイルシステム操作で使用する「汚染された」文字列は、 つねに適切に検証しなければなりません。 先ほどの例を改良したものを示します。
例2 入力を適切に検証する例
<?php$file = $_GET['file']; // 値として与えられる可能性のある、有効な値の一覧を作成しますswitch ($file) { case 'main': case 'foo': case 'bar': include '/home/wwwrun/include/'.$file.'.php'; break; default: include '/home/wwwrun/include/main.php';}?>