如何使用 php 删除查询字符串 URL 中的空字节


How can I remove null byte in my Query String URLs with Php?

我想知道如何删除 URL 中的空字节 (''0)。我知道从 Php 5.3.4 开始,这个安全漏洞已经修复,但也许可以从运行 php 5.3 或更低版本的其他服务器上的恶意用户传递一些东西。这可能使用查询字符串发生,我想了解如何保护我的 URL 以释放我的脚本,而不会对此错误产生安全影响。

示例:http://www.example.com/download.php?text=''0

我有两个假设:

A) $text = str_replace("'0", "", $text);

B) $text = str_replace(''0', '', $text);

什么版本是安全和正确的?A 还是 B?谢谢。

PS:我在 CentOS 上运行 php 5.6.17...使用阿帕奇 2.4。

这与安全性无关,但与 php 中处理字符串的方式有关:

  • 计算双引号字符串
  • 不计算单引号字符串

' 是转义字符,因此对以下字符进行转义。

要在双引号字符串中匹配它,您必须在前面附加一个反斜杠:''0

编辑:

你说"在 php 中删除空字节",然后"如果我把 $text = str_replace('''0', '', $text);''0 将被删除"。

这意味着在您的字符串中没有空字节,而是一个反斜杠,后跟一个零(≈空字节的表示)。

例子:

echo strlen( 'http://www.example.com/download.php?text=' );     // output: 41
echo strlen( "http://www.example.com/download.php?text='0" );   // output: 42 (Null)
echo strlen( 'http://www.example.com/download.php?text='0' );   // output: 43
echo strlen( ''0' );                                            // output: 2
echo strlen( "'0" );                                            // output: 1  (Null)

还有:

echo strlen(trim( "http://www.example.com/download.php?text='0" ));

将输出 41,因为trim删除空字节

echo strlen(trim( 'http://www.example.com/download.php?text='0' ));

将输出 43,因为trim不会删除'0

解决此特定问题的一种更简单方法是使用 chr() 函数:

$text = str_replace(chr(0), '', $text);