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

问题描述 投票:2回答:1

我想知道如何删除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 null byte query-string str-replace
1个回答
3
投票

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

  • 评估双引号字符串
  • 不评估单引号字符串

\是一个转义字符,因此以下字符被转义。

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

Edit:

你说“在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

© www.soinside.com 2019 - 2024. All rights reserved.