是否值得将我的代码更改为“更便携”并能够处理魔术引号的恐怖,或者我应该确保它始终通过 .htaccess 文件关闭?
if (get_magic_quotes_gpc()) {
$var = stripslashes($_POST['var']);
} else {
$var = $_POST['var'];
}
相对
php_flag magic_quotes_gpc off
是否值得将我的代码更改为“更便携”并能够处理魔术引号的恐怖,或者我应该确保它始终通过 .htaccess 文件关闭?
if (get_magic_quotes_gpc()) {
$var = stripslashes($_POST['var']);
} else {
$var = $_POST['var'];
}
相对
php_flag magic_quotes_gpc off
不要同时适应这两种情况。两个代码路径 = 两倍的麻烦,而且你很有可能会滑倒并忘记在某个地方处理这两种情况。
我曾经检查魔术引号是打开还是关闭,如果它们打开,请撤消它们的魔法(正如线程中的其他人所建议的那样)。这样做的问题是,您正在更改另一个程序员可能期望的配置环境(无论多么愚蠢)。
这些天来,我编写代码时好像关闭了魔术引号,并且在我的主 include/bootstrap/always-runs 文件中检查魔术引号是打开还是关闭。如果它们打开,我会抛出一个异常,解释为什么这是一件坏事,并提供有关如何关闭它们的说明。
这种方法允许您编写单一行为,鼓励其他人使用您的代码正确配置他们的服务器(魔术引号在 PHP 6 中将消失),如果有人真的需要魔术引号,他们可以处理您的异常并夺走他们的生命掌握在自己手中。
我会检查设置使用get_magic_quotes_gpc()
并做一个很大的嘈杂退出错误。在错误中通知管理员正确的设置。
如果可能的话,我会确保它关闭(需要访问 .htaccess 或 apache 配置)。最好完全避免它,而不是剥离它需要更多资源且容易出现错误的行为。
如果禁用它不是一个选项,您的示例代码可能对输入超全局变量($_GET,$_POST,...)有用,但请确保不要将其应用于来自这些超全局变量以外的源的数据。这种误用很常见。
只需确保在关闭 magic_quotes_gpc() 时有适当的转义机制来保护您免受 SQL 输入(例如 mysql_real_escape_string() 或 PDO 准备语句)。您可以在此处阅读有关 SQL 注入预防的更多信息。
更重要的是,php 6 将不再支持它们。因此,为它们编写代码在未来可能会有所帮助。