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