当我的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
答案 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中删除。
答案 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);
}
?>
答案 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 );
} );
}