我的服务器管理员最近升级到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有点自动化。 :)
答案 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
答案 2 :(得分:1)
答案 3 :(得分:1)
听起来你的服务器开启了魔术引号 - 你可以看看 http://www.php.net/manual/en/security.magicquotes.disabling.php详细讨论了禁用它们的方法。