我想知道如何删除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 ...使用Apache 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