禁用php.ini或.htaccess禁用php魔术引号的最佳方法

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

似乎有许多函数从$_GET$_POST等超全球系列striplaches,但我不知道哪一个是最好的。 此处的一些评论似乎还说,关键字还添加了需要剥离的斜杠。 所以我应该使用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 - 更短的魔术行情解决方案)

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:当Magic Quotes为ON时,如何(正确)移除数组中的转义引号)
(并且似乎所有这些方法都是不完整的,因为它们不会从所有受影响的超全域植物去除斜线,哪种超全球植被受magic_quotes_gpc = 1影响?)


下面是另外一个主要来自PHP的文章:如何在Magic Quotes开启时自动更改(正确)删除数组中的转义引号:

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,但它没有默认填充,所以事情应该没问题。


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

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

    我认为这很容易,并使代码更小,更简洁。

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


    第一种方法

    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数据,永远不会被转义。

    链接地址: http://www.djcxy.com/p/26569.html

    上一篇: Best method of disabling php magic quotes without php.ini or .htaccess

    下一篇: What are magic quotes runtime in PHP?