在尝试强化 PHP Web 应用程序以防止空字节中毒时,我注意到我实际上在我的请求中发送了一个空字节。
使用 cURL,我终于能够找到一种在我的请求中发送空字节的方法,但我注意到一些非常奇怪的事情:没有任何包含空字节的请求参数到达我的 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] => 空
)
如果我修改我的脚本和 cURL 请求以使用$_POST.
并不是我在抱怨,但我确实需要知道为什么会这样,这样我才能确保每个网络服务器都配置正确。
是什么导致了这种行为?
> php -v
PHP 5.3.3 (cli)(构建:2012 年 7 月 3 日 16:40:30)
版权所有 (c) 1997-2010 PHP 集团
Zend Engine v2.3.0,版权所有 (c) 1998-2010 Zend Technologies
与 Suhosin v0.9.29,版权所有 (c) 2007,SektionEins GmbH