PHP 5.3自动从表单字符串中转义$ _GET / $ _ POST?

时间:2011-07-10 18:09:12

标签: php forms escaping magic-quotes

我的服务器管理员最近升级到PHP 5.3,我得到了一个奇怪的“bug”(或feature,正如PHP人员所说的那样)。出于明显的安全原因,我的大部分字符串表单数据都有mysql_real_escape_string,但现在看来这种转义已经由PHP完成了。

<?php

echo $_GET["escaped"];

?>

<form method="get">
    <input type="text" name="escaped" />
</form>

如果我输入escape 'this test' escape \'this test\',则输出。如果我使用POST代替GET,也是如此。

它是否与5.3升级直接相关,或者我的管理员是否在php.ini文件中触发了一些自动切换?

另外,我应该保持原样(如果它确实是一个正确捕获所有get和post变量的良好的失败证明机制),或者我应该禁用它(如果这甚至可能!)并返回到mysql_real_escape_string?我的胆量告诉我方法2是最好的,但方法1有点自动化。 :)

编辑:实际上,我需要禁用它。有时我会收集表单数据并将其重新发送到客户端表单以防出现错误(即缺少字段),因此我不希望他/她出现突然出现的斜线。

4 个答案:

答案 0 :(得分:11)

此“功能”称为magic_quotes_gpc保护您免受所有SQL注入攻击(addslashes在输入超全局的每个元素上调用should not be used,例如{ {1}}和$_POST。这忽略了实际的输入/数据库编码)。因此不推荐使用includes a neat way to undo it in php code

官方php手册{{3}},但您应将其关闭

答案 1 :(得分:6)

这是由于magic quotes,你应该将其关闭。

以下是关闭它的方式:http://www.php.net/manual/en/security.magicquotes.disabling.php

您可以通过php.ini或从$_GET$_POST中删除所有变量的斜杠来实现,显然前者是推荐的方式。


正如威尔马丁建议你也可以通过这样的.htaccess改变它:

php_flag magic_quotes_gpc off

此处有更多信息:http://php.net/manual/en/configuration.changes.php

答案 2 :(得分:1)

答案 3 :(得分:1)

听起来你的服务器开启了魔术引号 - 你可以看看 http://www.php.net/manual/en/security.magicquotes.disabling.php详细讨论了禁用它们的方法。