magic_quotes_gpc()的解毒剂?

Ali*_*xel 1 php stripslashes magic-quotes-gpc addslashes

我已经看过几十个这样的PHP代码片段:

function DB_Quote($string)
{
    if (get_magic_quotes_gpc() == true)
    {
        $string = stripslashes($string);
    }

    return mysql_real_escape_string($string);
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话DB_Quote("the (\\) character is cool");会怎么样?(谢谢jspcal!)

难道我们不应该只在剥离斜线get_magic_quotes_gpc() == true 价值源于$_GET,$_POST$_COOKIE超全局变量?

nic*_*ckf 6

第一步是完全关闭魔术引号,如果打开则发出大量不可告知的警告.

如果这不是您的选择,那么在我看来,最好的方法是始终删除所有魔法引号.

// in an include used on every page load:
if (get_magic_quotes_gpc()) {
    foreach (array('_GET', '_POST', '_COOKIE', '_REQUEST') as $src) {
        foreach ($$src as $key => $val) {
            $$src[$key] = stripslashes($val);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

性能很小,但从那时开始处理变量时,会让您更轻松.


bob*_*nce 5

是的,我也看过几十个这样的PHP代码片段.有点难过.

魔术引号是输入问题.它必须在输入阶段修复,通过迭代GET/POST/COOKIES数组并删除斜杠,如果你需要你的应用程序在服务器上运行使用粗略的错误magic_quotes_gpc.简单的替代方法是检测魔术引号选项并在设置时出现"您的服务器糟糕"错误.

mysql_real_escape_string是一个输出问题.如果您没有使用参数化查询(您应该考虑使用参数化查询),它需要在脚本的出路上运行,内容标题为数据库.

这是计划中两个独立的无关阶段.你不能把它们放在同一个函数中,尽管它可能试图将你所有的字符串处理封装到一个盒子中.

我们不应该只在[...]来自$ _GET,$ _POST或$ _COOKIE超全球的价值时剥去斜线?

对,就是这样.这就是为什么你引用的片段确实有害.因为跟踪字符串的原点是不切实际的(特别是当您可能组合来自不同来源的字符串时,其中一个字符串被削减而另一个字符串没有),您无法在一个函数中执行此操作.它必须是在适当的时候调用的两个单独的字符串处理函数.

  • +1"简单的替代方案是检测魔术引号选项并在设置时因"你的服务器糟糕"错误而死亡." (2认同)