1

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

似乎有很多函数可以从所有$_GET,$_POST等超全局变量中剥离,但我不确定哪个是最好的。此外,这里的一些评论似乎说这些键还添加了斜杠,这些斜杠也需要被剥离。所以我应该使用 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
(而且似乎所有这些方法都不完整,因为它们没有从所有受影响的超全局变量中删除斜杠哪些超全局变量受 magic_quotes_gpc = 1 影响?

4

3 回答 3

2

这是另一个主要来自PHP 的内容:当魔术引号打开但我自己进行更改时,如何(正确地)删除数组中的转义引号:

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

专业人士

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

骗局

  • 可能会改变变量的顺序

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

于 2011-07-12T19:21:56.120 回答
0

第一种方法

专业人士

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

骗局

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

第二种方法

专业人士

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

骗局

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

第三种方法

专业人士

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

骗局

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

我一直在使用这个,它工作正常(在 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);
}

专业人士

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

骗局

  • 不剥离键

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

于 2011-07-12T08:49:57.593 回答
0

您可以通过执行以下操作摆脱斜线:

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

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

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

于 2011-07-12T09:09:34.723 回答