如何在运行时禁用PHP魔术引号?

时间:2009-07-20 13:58:20

标签: php runtime magic-quotes

我正在编写一组PHP脚本,这些脚本将在一些不同的设置中运行,其中一些与魔术引号共享托管(恐怖)。如果没有控制PHP或Apache配置的能力,我可以在脚本中做任何事情来在运行时禁用PHP引用吗?

如果代码没有假设魔术引号打开,那就更好了,这样我就可以在不同的主机上使用相同的脚本,这些主机可能有也可能没有魔术引号。

5 个答案:

答案 0 :(得分:15)

运行时只能禁用magic_quoted_runtime。但是magic_quotes_gpc在运行时不能被禁用(PHP_INI_ALL可变,直到PHP 4.2.3,从那时起PHP_INI_PERDIR);你只能删除它们:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

有关详细信息,请参阅Disabling Magic Quotes

答案 1 :(得分:5)

在运行时无法禁用魔术引号,但您可以使用目录中的.htaccess文件将其禁用。

php_flag magic_quotes_gpc off

唯一真正的优点是你可以把它放在一个目录中,它适用于整个目录和子目录。非常好,如果你需要这个你没有写的应用程序,并且需要让它在没有魔术引号的情况下工作。

答案 2 :(得分:2)

我有一个类似于Gumbo的小脚本(但当然我更喜欢我的):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
    set_magic_quotes_runtime(false);

if(get_magic_quotes_gpc()) {
    array_stripslashes($_POST);
    array_stripslashes($_GET);
    array_stripslashes($_COOKIES);
}

function array_stripslashes(&$array) {
    if(is_array($array))
        while(list($key) = each($array))
            if(is_array($array[$key]))
                array_stripslashes($array[$key]);
            else
                $array[$key] = stripslashes($array[$key]);
}

答案 3 :(得分:1)

PHP 5.3 +的另一个解决方案:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}

处理键,值和多维数组。

答案 4 :(得分:0)

无法在运行时完成:(