繁体   English   中英

magic_quotes_gpc()的解毒剂?

[英]Antidote for 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 superglobals时才删除斜线吗?

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

如果这不是您的选择,那么我认为,最好的方法是始终删除所有魔术引号。

// 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);
        }
    }
}

对性能的影响不大,但是从那时起使用变量时,您将更加放心。

是的,我也看过数十个这样的PHP代码段。 有点伤心

魔术引号是输入问题。 如果您需要让应用程序使用旧的错误性magic_quotes_gpc在服务器上运行,则必须在输入阶段通过迭代GET / POST / COOKIES数组并删除斜杠来解决该问题。 一种简单的替代方法是检测魔术引号选项,并在设置时死于“服务器糟透”错误。

mysql_real_escape_string是输出问题。 如果您不使用参数化查询(肯定应该考虑),则需要在脚本之外,内容指向数据库的情况下运行它。

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

难道我们不应该仅在值源自$ _GET,$ _POST或$ _COOKIE超全局变量时才去除斜线吗?

对,就是这样。 这就是为什么您引用的代码段确实有害的原因。 因为跟踪字符串的原点是不切实际的(特别是因为您可能组合了来自不同来源的字符串,其中一个被斜杠,另一个未被斜杠),所以您不能在一个函数中做到这一点。 它必须是在适当的时候调用的两个单独的字符串处理函数。

是的,就像dav所说的那样,直到脚本只在表单输入上使用反斜杠...

如果您使用字符串“ O'Reilly”调用脱衣舞,则该字符串将不会更改。 如果您使用以下字符串调用反斜杠:“反斜杠(\\)字符很酷”,则结果将转义序列\\)替换为)。 因此,在所有db值上使用该函数可能会破坏某些内容,但可能不会引起注意。

像许多应用程序一样,您也可能不支持魔术引号模式。 检查并打印错误(如果打开)。 默认情况下已禁用多年,不建议这样做。

数字6是正确的主意,但是没有用,因为直到PHP 5.4 $$ src [$ key]在$ src [$ key]上使用变量变量语法,该语法被解释为$ src [0],从而创建变量$ _是没用的。 只需在$ val和$ val = stripslashes($ val)上使用&(引用运算符)。 此外,否则从PHP 5.4开始,您可能会收到错误消息,因为PHP不仅会将_强制转换为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);
}
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM