如何使用 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("[=11=]", "", $text);

B) $text = str_replace('[=12=]', '', $text);

哪个版本是安全正确的?甲还是乙?谢谢

PS:我在 CentOS 上 运行 php 5.6.17...使用 Apache 2.4。

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

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

\是转义字符,所以后面的字符被转义。

要在双引号字符串中匹配它,您必须在前面加上一个额外的反斜杠:\0

编辑:

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

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

示例:

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

echo strlen( '[=10=]' );                                            // output: 2
echo strlen( "[=10=]" );                                            // output: 1  (Null)

还有:

echo strlen(trim( "http://www.example.com/download.php?text=[=11=]" ));

会输出,41,因为trim去掉了空字节

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

将输出 43,因为 trim 不会删除 [=17=]

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

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