我想知道如何删除 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);