magic_quotes_gpc()的解毒剂?

时间:2010-01-04 01:11:44

标签: php stripslashes addslashes magic-quotes-gpc

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

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

    return mysql_real_escape_string($string);
}

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

我们不应该仅在get_magic_quotes_gpc() == true 来自$_GET$_POST$_COOKIE超全球的值时才删除斜杠?< / p>

5 个答案:

答案 0 :(得分: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);
        }
    }
}

效果不佳,但从那时开始处理变量时,您会更加轻松。

答案 1 :(得分:5)

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

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

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

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

  

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

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

答案 2 :(得分:2)

是的,正如dav所说,直到脚本只在表单输入上使用stripslashes ...

如果使用字符串“O'Reilly”调用stripslashes,则不会更改字符串。如果你用一个字符串调用stripslashes:“反斜杠(\)字符很酷”,结果将替换转义序列\)。因此,在所有数据库值上使用该函数可能会巧妙地破坏事物,但可能不会被注意到。

像许多应用程序一样,你也可能不支持魔术引号模式。检查它并打印错误,如果它打开。它默认情况下已经关闭多年,不推荐使用。

答案 3 :(得分:0)

您可以尝试在$ _GET,$ _POST或$ _COOKIE上执行以下操作,然后再对其执行任何操作:

<?php
if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('stripslashes', $_POST);
}
?>

注意,这仅在输入数组为“flat”(不包含子数组)时才有效。如果你期望输入中的子数组,那么你需要编写自己的回调来处理它。像

这样的东西
<?php
function slashField ($input)
{
    if (is_array ($input))
    {
        foreach ($input as $key => $row)
        {
            $input [$key]   = slashField ($row);
        }
    }
    else
    {
        $input  = stripslashes ($input);
    }
    return ($input);
}

if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('slashfield', $_POST);
}
?>

答案 4 :(得分:0)

6号是正确的想法,但不起作用,因为直到PHP 5.4 $$ src [$ key]在$ src [$ key]上使用变量变量语法,它被解释为$ src [0],创建变量$ _这是没用的。只需使用&amp; ($参考运算符)$ val和$ val = stripslashes($ val)。此外,否则从PHP 5.4开始,您可能会收到错误,因为PHP不会仅将_转换为0