什么导致请求中的空字节值被过滤掉?

7 php security curl

在尝试强化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

hak*_*kre 0

首先禁用 Suhosin。它已经解决了这个问题。

只要你启用了它,你就不能那么容易地注入 NUL 字节。