为什么$ _POST变量在PHP中被转义?

时间:2010-03-22 23:19:27

标签: php ajax post escaping

当我的PHP脚本从AJAX POST请求接收数据时,$_POST变量将被转义。真奇怪的是,这只发生在我的生产服务器上(在Linux上运行PHP 5.2.12)而不是在我的本地服务器上(在Windows上运行PHP 5.3.1)。

这是AJAX代码:

var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

pageRequest.onreadystatechange = function() { }

var q_str = 'data=' + " ' ";

pageRequest.open('POST','unnamed_page.php',true);

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

这是否有任何原因发生?我应该如何解决这个问题,以便它可以在两台服务器上运行?

编辑:我有magic_quotes的以下设置:

                     Local   Master

magic_quotes_gpc     On      On
magic_quotes_runtime Off     Off
magic_quotes_sybase  Off     Off

7 个答案:

答案 0 :(得分:64)

您可能在Linux服务器上启用了魔术引号:magic_quotes

  

当magic_quotes打开时,所有'(单引号),(双引号),\(反斜杠)和NUL都会自动转义为反斜杠。

禁用它们是一件好事,因为无论如何它们将从PHP 6开始删除。 您还应该能够在脚本中禁用它们:set-magic-quotes-runtime 您无法停用在运行时期间负责转义POST数据的magic_quotes部分。如果可以,请在php.ini中禁用它。如果您不能这样做,请检查magic_quotes是否已启用,并对从POST获取的任何内容执行stripslashes():

if (get_magic_quotes_gpc())  
 $my_post_var = stripslashes($_POST["my_post_var"]);

答案 1 :(得分:28)

我不认为这适用于您的情况,但我只是遇到了类似的问题。我正在加载一个Wordpress安装以及一个网站,所以我可以在所有页面上显示最近的帖子。事实证明,无论magic_quotes设置为什么,Wordpress都会逃脱所有$ _POST变量。

我提到它是因为弄清楚这是令人沮丧的,并且谷歌搜索答案把我带到了这里。

以下是我在我的案例中修复它的方法:

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;

答案 2 :(得分:9)

这是一个称为Magic Quotes的PHP“功能”,现在已在PHP 5.3中弃用,并在PHP 5.4中删除。

It is easy to disable the silly nuisance in php.ini.

答案 3 :(得分:4)

您可能在生产环境中启用了魔术引号。检查phpinfo()输出。

您可以通过类似的方式运行所有输入来删除引号:

        /* strip slashes from the string if magic quotes are on */
    static function strip_magic_slashes($str)
    {
            return get_magic_quotes_gpc() ? stripslashes($str) : $str;
    }

答案 4 :(得分:2)

也许你的Linux服务器的php.ini启用了魔术引号。

http://php.net/manual/en/security.magicquotes.php

这当然很糟糕,因为该功能已弃用,将在即将推出的PHP 6中删除。

您可以在php.ini中禁用它,如此

magic_quotes_gpc = Off

如果无法访问php.ini

,可以在运行时测试和禁用它
<?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 Manual

答案 5 :(得分:2)

所以我确实和一个wordpress dev(https://core.trac.wordpress.org/ticket/40476#ticket)交谈,他说:

“早在许多月前,WordPress盲目地跟随PHP接受所有超全球价值应该被削减。 PHP后来对这个想法进行了逆转,你今天看到了更加理智的东西,但损坏已经完成,WordPress作为一个应用程序已经存在了足够长的时间,并且有足够的现有插件和主题依赖于WordPress创建一个理智的单一环境, WordPress也在改变会对这些网站造成无法弥补的损害 - 引入安全漏洞,破坏内容以及其他一些有趣的东西。 https://core.trac.wordpress.org/ticket/18322是我们追踪这一点并获得更多理智的门票 - 在短期(和更长期)内我们要求如果你正在访问$ _POST变量,你可以这样做:$ myvar = wp_unslash( $ _POST ['variable']);所以有一天,我们将能够将$ _POST作为一个未经过删除的数组。

关于这里给出的答案:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; 
$_POST = $temp_POST;

请不要那样做。您只是打开自己的安全问题,以及WordPress希望减少值的内容发生意外情况。 相反,只需使用wp_unslash(),如果您确实需要$ _POST的副本来自行操作,请按以下方式操作:$my_POST = wp_unslash( $_POST );

我还应该添加 - 我希望你这样做,因为你正在尝试使用API​​端点,我强烈建议切换到使用WordPress 4.7引入的REST API,因为它允许我们为开发人员提供更加一致的体验。 “

答案 6 :(得分:-1)

基于所有答案的优雅解决方案

if ( get_magic_quotes_gpc() ) {
    array_walk_recursive( $_POST, function ( &$element ) {
        $element = stripslashes( $element );
    } );
}