如何关闭共享主机上的魔术引号?

我想关闭PHP的魔术引号。 我没有访问php.ini。

当我尝试将php_flag magic_quotes_gpc off添加到我的.htaccess文件时,出现500内部服务器错误。 这就是我的.htaccess文件的样子:

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off

然后我尝试使用ini_set('magic_quotes_gpc', 'O') ,但那没有任何作用。

如何关闭魔术报价?


根据手册,您可以经常在共享主机上安装自定义php.ini,其中mod_php未使用,并且php_value指令因此导致错误。 对于suexec / FastCGI设置,在任何情况下都有一个per-webspace php.ini是很常见的。

-

我不认为O(大写字母o)是设置ini标志的有效值。 您需要使用true / false,1/0或“on”/“off”值。

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work

编辑

检查ini设置列表后,我看到magic_quotes_gpc是一个PHP_INI_PERDIR设置(在4.2.3之后),这意味着您不能使用ini_set()更改它(只能使用ini_set()更改PHP_INI_ALL设置)

这意味着你必须使用.htaccess文件来做到这一点 - 或者 - 实现一个脚本来反转魔术引号的效果。 像这样的东西

if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
    $_POST = array_map( 'stripslashes', $_POST );
    $_GET = array_map( 'stripslashes', $_GET );
    $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}

虽然我不能说为什么php_flag会给你500 Internal Server Error ,但我会指出,PHP手册有一个例子,它检测魔术引号是否打开,并在运行时从超级全局变量中剥离它。 与其他人发布的不同,这一个是递归的,并且会正确地从数组中除去引号:

更新:我今天注意到在PHP手册中有一个新版本的代码,它使用对超全局变量的引用。

旧版:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

新版本:

<?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.ini文件时出现“Class”PDO'找不到'的问题。

如果你不能使用htaccess文件关闭魔术引号(由于Pete Bailey已经给出的理由),只需:

  • 创建一个文本文件
  • 将它重命名为'php.ini'
  • 添加行

    magic_quotes_gpc =关
    magic_quotes_runtime =关
    magic_quotes_sybase =关闭
    延长= pdo.so
    延长= pdo_mysql.so

  • 将其保存到您的脚本正在执行的目录中。

  • 更新:如果你想只有一个新的php.ini文件的副本,然后将此行添加到您的根.htaccess文件中:

    SetEnv PHPRC /path/to/site/root/public_html/php.ini
    

    很明显,你需要将ini文件移动到这个位置,这个位置已经不存在了。

    希望能节省2小时的时间,只需要我!

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

    上一篇: How to turn off magic quotes on shared hosting?

    下一篇: What are the best PHP input sanitizing functions?