解决魔法引号,或者只是确保它们已关闭?

时间:2008-12-16 01:57:33

标签: php magic-quotes-gpc

是否值得将我的代码更改为“更便携”并能够处理魔法引号的恐怖,或者我应该确保它始终通过.htaccess文件关闭?

if (get_magic_quotes_gpc()) {
    $var = stripslashes($_POST['var']);
} else {
    $var = $_POST['var'];
}

对战

php_flag magic_quotes_gpc off

4 个答案:

答案 0 :(得分:14)

不适应这两种情况。两个代码路径=头痛的两倍,而且很有可能你会滑倒并忘记在某处处理这两种情况。

我曾经检查魔法引号是否打开,如果它们打开,则撤消它们的魔法(正如线程中的其他人所建议的那样)。这个问题是,你正在改变另一个程序员可能期望的配置环境(无论多么愚蠢)。

这些天我写的代码好像魔术引号已关闭,而在我的主要包含/ bootstrap / always-runs文件中,我会检查魔术引号是打开还是关闭。如果他们在,我会抛出一个异常,解释为什么这是坏事,并提供关于如何关闭它们的说明。

这种方法允许您对单个行为进行编码,鼓励其他人使用您的代码正确配置他们的服务器(魔术引用在PHP 6中消失),如果有人真的需要魔术引号在他们可以处理你的例外并将他们的生命掌握在自己手中。

答案 1 :(得分:4)

我会使用get_magic_quotes_gpc()检查设置并执行错误的大噪声退出。在错误中通知管理员正确的设置。

答案 2 :(得分:2)

如果可能的话,我会确保它已关闭(需要访问.htaccess或apache配置)。最好完全避免它,而不是剥离它需要更多资源并容易出错的行为。

如果禁用它不是一个选项,那么您的示例代码可能对输入超级全局($ _GET,$ _ POST,...)有用,但请确保不将其应用于来自非超级球员以外的数据的数据。这种滥用is pretty common

只需确保关闭magic_quotes_gpc()以使其具有适当的转义机制以保护您免受SQL内联(例如mysql_real_escape_string()或PDO预处理语句)。您可以阅读有关SQL注入预防的更多信息 - here

答案 3 :(得分:1)

在更多的旁注中,php 6将不再支持它们了。因此,为他们编写代码可能会对将来有所帮助。