为什么$\u POST变量在PHP中被转义?

为什么$\u POST变量在PHP中被转义?,php,ajax,post,escaping,Php,Ajax,Post,Escaping,当我的PHP脚本从AJAX POST请求接收数据时,将转义$\u POST变量。真正奇怪的是,这种情况只发生在我的生产服务器上(在Linux上运行PHP5.2.12),而不发生在我的本地服务器上(在Windows上运行PHP5.3.1) 以下是AJAX代码: var pageRequest = false; if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest(); else if(window.ActiveXObject)

当我的PHP脚本从AJAX POST请求接收数据时,将转义
$\u POST
变量。真正奇怪的是,这种情况只发生在我的生产服务器上(在Linux上运行PHP5.2.12),而不发生在我的本地服务器上(在Windows上运行PHP5.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_引号有以下设置:

                     Local   Master

magic_quotes_gpc     On      On
magic_quotes_runtime Off     Off
magic_quotes_sybase  Off     Off

也许您的Linux服务器的php.ini启用了神奇的引号

这当然不好,因为该功能已被弃用,将在即将发布的PHP6中删除

您可以像这样在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);
}
?>


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

启用magic_quotes时,所有“(单引号)、“(双引号)、\(反斜杠)和NUL将自动用反斜杠转义

禁用它们是一件好事,因为它们将从PHP6开始被删除。您还应该能够在脚本中禁用它们:您不能停用magic_引号中负责在运行时转义POST数据的部分。如果可以,请在PHP.ini中禁用它。如果不能这样做,请检查magic_引号是否为启用,并对从POST获取的任何内容执行stripslashes():

if (get_magic_quotes_gpc())  
 $my_post_var = stripslashes($_POST["my_post_var"]);
这是一个PHP“特性”,称为,在PHP5.3中已被弃用,并在PHP5.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;
    }

我不认为这适用于你的情况,但我只是遇到了一个类似的问题。我在加载一个WordPress安装和一个站点,这样我可以在所有页面上显示最近的帖子。结果表明,WordPress会转义所有的$\u POST变量,不管设置了什么magic\u引号

我提到它是因为它让人沮丧,谷歌搜索答案让我来到了这里

以下是我如何在我的案例中修复它:

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

所以我和一个WordPress开发者()谈过,他说:

回到那个时代,许多月前,WordPress盲目地跟随PHP接受所有超全局值都应该被删除。 PHP后来对这个想法做了一个逆转,使之变得更加理智,正如您今天看到的,但是损害已经造成了

WordPress作为一个应用程序已经存在了足够长的时间,有足够多的现有插件和主题依赖WordPress创建一个健全的单一环境,WordPress的改变也会对这些网站造成不可修复的损害——引入安全漏洞、篡改内容和其他一些有趣的事情

这是我们追踪这一点并获得更理智的结果的门票——在短期(和长期)内,我们要求,如果您访问$\u POST变量,您可以这样做:$myvar=wp\u unslash($\u POST['variable']);这样,有一天,我们将能够将$\u POST作为一个非slash数组

关于这里给出的答案:

$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php';
$_POST = $temp_POST;
请不要这样做。你只会让自己面临安全问题,以及WordPress期望值被删除的内容上发生的意外事件。 相反,只需使用
wp\u unslash()
,如果您确实需要一份$\u POST的副本来对自己进行操作,请这样做:
$my\u POST=wp\u unslash($\u POST);


我还应该补充一点——我希望您这样做是因为您试图使用API端点来完成某些事情,我强烈建议您改用WordPress 4.7引入的REST API,因为它允许我们为开发人员提供更加一致的体验。

如何解决此问题?我无法在生产服务器上编辑php.ini。请检查e代码示例,或单击手动链接以了解更多信息。我选中了phpinfo():果然,它已在生产服务器上启用。@George如果按照说明进行检查,它将与本地服务器一起工作,因为
get\u magic\u quotes\u gpc()
将返回false,并且不会删除斜杠。尝试一下,对函数进行测试输出。但最好是在linux机器上禁用magic quotes。您可以执行
phpinfo()
,它会告诉你什么是启用的,什么不是。@George这是一种安全措施,通过使用斜杠自动转义相关数据来防止SQL注入。基本上这是一个不错的主意,但它从未流行起来,并最终成为一个讨厌的东西,正如你的案例所说明的那样。这很好,除了我自己为了自己的利益而转义之外SQL注入,因此
Joe的头
$\u POST
中变成
Joe的头
,在查询中变成
Joe\\\\\\\\\\\\的头
。@George是的,上面的检查是为了确保数据在本地和远程服务器上处于相同的状态:没有斜线。(理论上,你甚至可以直接在POST变量上这样做,但我总是不喜欢写$u POST。)之后,你可以再次将它放在心上。我总是更喜欢
$u POST=array\u map('stripslashes',$u POST);
也许这是一个特性,而不是一个bug。在wp-settings.php中,方法wp\u magic\u()被调用,定义在wp includes/load.php中。该方法确保在WordPress中引用所有参数,而不考虑神奇的引号。我认为更准确的描述是“有人打算将其作为一项功能,但没有考虑后果,所以现在它对其他人来说是一个bug如果wordpress复制POST Var供自己使用,然后将其转移到那里,而不是改变POST中的实际内容,而wordpress之外的任何东西都必须处理这些变化,那么这很容易避免。耶稣基督的圣母保佑您@SyntaxError您将拥有一个繁荣和治愈的世界