2010-03-15 46 views
2

今天我遇到了一些奇怪的PHP,我没有在文档中找到合适的解释。考虑下面的代码:为什么PHP中的_GET错误地解码斜线?

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

该代码很简单 - 它只需要一个单一的参数在url上并输出回来。 ?所以,如果你用test.php的牛逼称之为=%5CA(%5C是 '\'),我期望看到:

\a 

然而,这是我得到了什么:

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

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

感谢, 波阿斯

PS。我正在使用PHP 5.2.11

回答

6

发生这种情况是因为您在php.ini中打开了“magic quotes”开关。从手册:

当打开时,所有的'(单引号),“ (双引号),\(反斜线)和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. 
+0

可以通过使用stripslashes()函数来治愈 – 2010-03-15 15:39:53

+0

你很容易受到SQL注入。您应该始终使用参数化查询。没有理由。 – Kibbee 2010-03-15 15:59:18

+0

Magic_quotes将会在PHP 6中被删除,所以最好不要依赖它。 – 2010-03-15 16:03:45

0

您可以使用strip_slashes()函数轻松修复此问题。你应该避免使用魔术引号;出于安全原因,它们已被弃用。如果你是依赖于魔术引号来保护你

0

打开.htaccess文件,并把这样的事情

php_flag magic_quotes_gpc off 
php_flag magic_quotes_runtime off