在没有php.ini或.htaccess的情况下禁用php魔术引号的最佳方法

时间:2011-07-12 08:28:38

标签: php magic-quotes-gpc

我需要编写可在启用了magic_qoutes_gpc的共享服务器上运行的可移植代码,我无法在php.ini或.htaccess中更改它。 (服务器正在运行php 5.2)

似乎所有$_GET$_POST等超级全球的剥离有很多功能,但我不确定哪种是最好的。还有一些评论here似乎说密钥也有添加的斜杠,也需要剥离。我应该使用PHP网站上的那个:

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

或类似的东西:(来自这个答案:PHP - Shorter Magic Quotes Solution

function strip_slashes_recursive(&$value) {
    if (!is_array($value)) {
        $value = strip_slashes($value);
    } else {
        foreach (array_keys($value) as $key) {
            $arrayValue = strip_slashes_recursive($value[$key]);
            unset($value[$key]);
            $value[strip_slashes($key)] = $arrayValue;
        }
    }
}

foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) {
    strip_slashes_recursive($array);
}
// don't forget to unset references or it can lead to very nasty bugs
unset($array);

甚至是这样的:

if (get_magic_quotes_gpc()) {
    function undoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $key = stripslashes($key);
            }
            if (is_array($value)) {
                $newArray[$key] = undoMagicQuotes($value, false);
            }
            else {
                $newArray[$key] = stripslashes($value);
            }
        }
        return $newArray;
    }
    $_GET = undoMagicQuotes($_GET);
    $_POST = undoMagicQuotes($_POST);
    $_COOKIE = undoMagicQuotes($_COOKIE);
    $_REQUEST = undoMagicQuotes($_REQUEST);
}

有人可以解释每种方法的优缺点和/或完全不同的方法以及它们的彻底性,以及它们是否从键中删除斜线以及值。

(这种方法也很好:PHP: how to (correctly) remove escaped quotes in arrays when Magic Quotes are ON
(并且看起来所有这些方法都不完整,因为它们不会从所有受影响的超级全球中删除斜线Which superglobals are affected by magic_quotes_gpc = 1?

3 个答案:

答案 0 :(得分:1)

这是另一个主要来自PHP: how to (correctly) remove escaped quotes in arrays when Magic Quotes are ON但又有我自己的变化:

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    function unMagicQuotify($array) {
        $fixed = array();
        foreach ($array as $key=>$val) {
            if (is_array($val)) {
                $fixed[stripslashes($key)] = unMagicQuotify($val);
            } else {
                $fixed[stripslashes($key)] = stripslashes($val);
            }
        }
        return $fixed;
    }

    $_GET = unMagicQuotify($_GET);
    $_POST = unMagicQuotify($_POST);
    $_COOKIE = unMagicQuotify($_COOKIE);
    $_REQUEST = unMagicQuotify($_REQUEST);
    $_FILES = unMagicQuotify($_FILES);
}

<强> Pro的

  • 它们适用于数组和单个变量
  • 剥离密钥
  • 不使用参考

<强>精读的

  • 可能会更改变量的顺序

请注意,包含$ _FILES作为魔术引号也会影响它。 至于阅读文件(file_get_contents)和/或使用php://输入我无法判断魔术引号是否会影响它们,但是当你阅读它们时你必须使用stripslashes()并且无法做到这样的事情。我没有设法检查$ HTTP_RAW_POST_DATA,但默认情况下它没有填充,所以事情应该没问题就可以了。

答案 1 :(得分:0)

第一种方法

Pro的

  • 它们适用于数组和单个变量
  • 剥离密钥

精读的

  • 代码太长,无法满足需要

第二种方法

Pro的

  • 它们适用于数组和单个变量

精读的

  • 代码太长,无法满足需要
  • 不剥离密钥

第三种方法

Pro的

  • 它们适用于数组和单个变量
  • 剥离密钥

精读的

  • 代码太长,无法满足需要

我一直在使用它,它运行正常(在osTicket中找到它,我喜欢开源):

function strip_slashes($var){
    return is_array($var)?array_map('strip_slashes',$var):stripslashes($var);
}


if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    $_POST = strip_slashes($_POST);
    $_GET = strip_slashes($_GET);
    $_REQUEST = strip_slashes($_REQUEST);
    $_COOKIE = strip_slashes($_COOKIE);
}

Pro的

  • 它们适用于数组和单个变量

精读的

  • 不剥离密钥

我从来没有遇到过剥离钥匙的需要。许多开源库都没有这样做(例如Wordpress,osTicket)。通常我只使用永远不会被转义的$ _POST和$ _GET数据的名称。

答案 2 :(得分:0)

你可以通过执行以下操作来摆脱斜杠:

$_REQUEST = array_map('stripslashes', $_REQUEST);

我认为它更容易,使代码更小,更简洁。

我确定你知道在使用魔术引号指令时会出现什么问题(这是一篇文章http://www.sitepoint.com/magic-quotes-headaches/)。但IMO最好将您的应用程序移动到另一个托管服务提供商,以防您当前的提供商无法关闭魔术报价。此外,使用过时的PHP版本并不是一个好主意。