【问题标题】:Best method of disabling php magic quotes without php.ini or .htaccess在没有 php.ini 或 .htaccess 的情况下禁用 php 魔术引号的最佳方法
【发布时间】:2011-10-03 10:26:18
【问题描述】:

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

似乎有很多函数可以从所有$_GET$_POST 等超全局变量中剥离,但我不确定哪个是最好的。还有一些 cmets 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?

【问题讨论】:

  • 精辟的回答:转移到一个半体面的托管服务。

标签: php magic-quotes-gpc


【解决方案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);
}

专业人士

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

骗局

  • 可能会改变变量的顺序

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

【讨论】:

    【解决方案2】:

    第一种方法

    专业人士

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

    骗局

    • 代码太长,不符合要求

    第二种方法

    专业人士

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

    骗局

    • 代码太长,不符合要求
    • 不剥离密钥

    第三种方法

    专业人士

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

    骗局

    • 代码太长,不符合要求

    我一直在用这个,效果不错(在 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 数据使用名称。

    【讨论】:

    • 对不起,你能解释一下每种方法的优缺点,而不是整体,我不太清楚你所说的“以最简单的方式:...... ." 您的方法是否会从键和值中删除斜杠?
    • 这个Format类,在PHP库中吗?
    • @phant0m 哎呀,不,不是,它在 osTicket 的一个类中。我会修改我的答案。
    • 你在 Con 的部分中同时拥有“Does strip the keys”和“Does not strip the keys”
    • 是的,抱歉,一开始我以为他们没有拆掉钥匙,然后忘了把它移到 Pro 部分。
    【解决方案3】:

    您可以通过执行以下操作来消除斜线:

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

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

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

    【讨论】:

    • 但它不会从键中删除斜杠吗?
    猜你喜欢
    • 2011-11-25
    • 2012-10-16
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2013-12-08
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多