在尝试强化PHP Web应用程序以防止空字节中毒时,我注意到我实际上在我的请求中发送了一个空字节.
使用cURL,我终于能够找到一种在我的请求中发送空字节的方法,但我注意到一些非常奇怪的事情:没有请求参数,其值包含空字节到达我的PHP应用程序.
作为概念证明,我创建了一个test.php在我的服务器上命名的文件:
<?php echo json_encode($_GET), PHP_EOL;
Run Code Online (Sandbox Code Playgroud)
以下是对此脚本的一些请求的结果:
> 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);
Run Code Online (Sandbox Code Playgroud)
> curl 'http://localhost/test.php?foo=bar&baz=nu%00ll'
Array
(
[foo] => bar
)
> curl 'http://localhost/test.php?foo=bar&b%00az=null'
Array
(
[foo] => bar
[b] => null
)
如果我修改我的脚本和cURL请求使用,也会发生同样的事情$_POST.
不是我抱怨,但我确实需要知道为什么会这样,这样我才能确保每个网络服务器都配置正确.
是什么导致了这种行为?
> php -v
PHP 5.3.3 (cli) (built: Jul 3 2012 16:40:30)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Suhosin v0.9.29, Copyright (c) 2007, by SektionEins GmbH
| 归档时间: |
|
| 查看次数: |
3723 次 |
| 最近记录: |