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

Boa*_*oaz 2 php get escaping

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

<?php
echo $_GET['t']. PHP_EOL;
?>
Run Code Online (Sandbox Code Playgroud)

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

\a
Run Code Online (Sandbox Code Playgroud)

但是,这就是我得到的:

$ curl http://localhost/~boaz/test.php?t=%5Ca
\\a
Run Code Online (Sandbox Code Playgroud)

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

谢谢,波阿斯

PS.我正在使用PHP 5.2.11

nai*_*sts 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.
Run Code Online (Sandbox Code Playgroud)