为什么$\u POST变量在PHP中被转义?
当我的PHP脚本从AJAX POST请求接收数据时,将转义为什么$\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)
$\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您将拥有一个繁荣和治愈的世界