为什么PHP中的_GET错误地解码斜杠?

时间:2010-03-15 15:36:05

标签: php get escaping

今天我遇到了一些奇怪的PHP,我在文档中找不到合适的解释。请考虑以下代码:

<?php
echo $_GET['t']. PHP_EOL;
?>

代码很简单 - 它在url上需要一个t参数并将其输出。所以,如果你用test.php调用它?t =%5Ca(%5c是'\'),我希望看到:

\a

然而,这就是我所得到的:

$ curl http://localhost/~boaz/test.php?t=%5Ca
\\a

注意双斜杠。任何人都可以解释发生了什么,并提供检索URL上提供的字符串的方法吗?

谢谢, 波阿斯

PS。我正在使用PHP 5.2.11

3 个答案:

答案 0 :(得分:6)

这种情况发生了,因为你在php.ini中打开了“魔术引号”开关。从手册:

  

启用时,所有'(单引号),   (双引号),\(反斜杠)和NULL   字符转义为   自动反斜杠。这是   与addslashes()相同。

在此处详细了解:http://php.net/manual/en/security.magicquotes.php

要让您的脚本知道php.ini中“magic_quotes_gpc”设置的任何值,您可以像这样编写脚本:

$d = $_GET["d"];
if (get_magic_quotes_gpc()) $d = stripslashes($d);
echo $d; //but now you are kind of vulnerable to SQL injections
         //if you don't properly escape this value in SQL queries.

答案 1 :(得分:0)

您可以使用strip_slashes()函数轻松解决此问题。你应该避免使用魔法引号;出于安全考虑,他们已被弃用。

答案 2 :(得分:0)

打开.htaccess文件并输入类似的内容

php_flag magic_quotes_gpc off
php_flag magic_quotes_runtime off