PHP Webアプリをヌルバイトポイズニングに対して強化しようとしているときに、リクエストで実際にヌルバイトを送信するのにかなりの時間がかかっていることに気付きました。
cURLを使用して、リクエストでnullバイトを送信する方法をようやく見つけることができましたが、非常に奇妙なことに気づきました。nullバイトを含む値のリクエストパラメーターがPHPアプリケーションに到達することはありません。
概念実証としてtest.php、サーバー上に次の名前のファイルを作成しました。
<?php echo json_encode($_GET), PHP_EOL;
このスクリプトへのいくつかのリクエストの結果は次のとおりです。
> curl'http://localhost/test.php?foo = bar&baz = nu%00ll'
{"foo": "bar"}
> curl'http://localhost/test.php?foo = bar&b%00az = null'
{"foo": "bar"、 "b": "null"}
キーがヌルバイトで切り捨てられているようです。値にヌルバイトが含まれている場合、パラメータはリクエスト配列から完全に削除されます。
使用print_r()すると、同様の結果が得られます。
<?php print_r($_GET);
> curl'http://localhost/test.php?foo = bar&baz = nu%00ll'
配列
((
[foo]=>バー
)。
> curl'http://localhost/test.php?foo = bar&b%00az = null'
配列
((
[foo]=>バー
[b] => null
)。
を使用するようにスクリプトとcURLリクエストを変更した場合も、同じことが起こります$_POST。
不平を言っているわけではありませんが、各Webサーバーが正しく構成されていることを確認できるように、なぜこれが発生しているのかを知る必要があります。
この動作の原因は何ですか?
> php -v
PHP 5.3.3(cli)(ビルド:2012年7月3日16:40:30)
Copyright(c)1997-2010PHPグループ
Zend Engine v2.3.0、Copyright(c)1998-2010 Zend Technologies
Suhosin v0.9.29、Copyright(c)2007、by SektionEins GmbH