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

Joh*_*ohn 41 php magic-quotes-gpc

我想关掉PHP的魔术引号.我无法访问php.ini.

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

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用ini_set('magic_quotes_gpc', 'O'),但这没有效果.

如何关闭魔术报价?

Pet*_*ley 42

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

-

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

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work
Run Code Online (Sandbox Code Playgroud)

编辑

在检查了ini设置列表后,我看到magic_quotes_gpc是一个PHP_INI_PERDIR设置(在4.2.3之后),这意味着你不能用它来改变它ini_set()(只有PHP_INI_ALL设置可以改变ini_set())

这意味着您必须使用.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 );
}
Run Code Online (Sandbox Code Playgroud)


Pow*_*ord 30

虽然我不能说为什么php_flag会给你500 Internal Server Errors,但我会指出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);
}
?>
Run Code Online (Sandbox Code Playgroud)

新版本:

<?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);
}
?>
Run Code Online (Sandbox Code Playgroud)


gon*_*nzo 20

这将解决在创建本地php.ini文件时获取"未找到"类'PDO'的问题.

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

  1. 创建一个文本文件
  2. 将其重命名为'php.ini'
  3. 添加行

    magic_quotes_gpc =关闭
    magic_quotes_runtime =关闭
    magic_quotes_sybase =关闭
    扩展名= pdo.so
    extension = pdo_mysql.so

  4. 将其保存到执行脚本的目录中.

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

SetEnv PHPRC /path/to/site/root/public_html/php.ini
Run Code Online (Sandbox Code Playgroud)

显然你需要将ini文件移动到它的位置.

希望拯救某人2个小时,它刚刚带走了我!

  • 好悲伤,这正是我所需要的.死亡引用. (2认同)

djn*_*djn 10

.htaccess文件中的php_flag和php_value在技术上是正确的 - 但是对于仅作为Apache模块安装的PHP.在共享主机上,您几乎永远不会找到这样的设置; 由于与安全性相关的原因(保持服务器邻居不在文件中)以及phpsuexec以"你"而不是apache用户运行脚本的方式,PHP作为CGI运行.

因此Apache正确地给你一个服务器错误:除非加载了PHP模块,否则它不知道php_flag的含义.CGI二进制文件对Apache来说是一个外部程序,你不能在Apache中配置它.

现在好消息:你可以设置每个目录配置,放置一个名为' php.ini ' 的文件,并使用与系统主php.ini中相同的语法设置你的指令.在PHP手册中列出了所有可设置的指令:您可以设置标有PHP_INI_PERDIR或PHP_INI_ALL,而只有系统管理员可以设置在服务器范围的php.ini那些标记PHP_INI_SYSTEM.

请注意,这样的php.ini指令不会被子目录继承,你必须给它们自己的php.ini.


T.T*_*dua 5

======================== ===============我的解决方案========= ===================(将你的php.ini重命名为php5.ini)

并在顶部(!),添加以下内容:

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so
Run Code Online (Sandbox Code Playgroud)

然后在.htaccess中,添加它(在顶部):

SetEnv PHPRC /home/your_path/to/public_html/php5.ini
Run Code Online (Sandbox Code Playgroud)

ps /home/your_path/to/正确更改(您可以通过<?php phpinfo(); ?>从典型的.php文件执行命令来查看该路径.)