Nat*_*man 37 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);
Run Code Online (Sandbox Code Playgroud)
这有什么原因吗?我应该如何解决这个问题,以便它可以在两台服务器上运行?
编辑:我有magic_quotes的以下设置:
Local Master
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off
Run Code Online (Sandbox Code Playgroud)
Pek*_*ica 65
您可能在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"]);
Run Code Online (Sandbox Code Playgroud)
Syn*_*ror 28
我不认为这适用于你的情况,但我只是遇到了类似的问题.我正在加载一个Wordpress安装以及一个网站,所以我可以在所有页面上显示最近的帖子.事实证明,无论magic_quotes设置为什么,Wordpress都会逃脱所有$ _POST变量.
我提到它是因为弄清楚这是令人沮丧的,谷歌搜索答案把我带到了这里.
以下是我在我的案例中修复它的方法:
$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // Loading WordPress
$_POST = $temp_POST;
Run Code Online (Sandbox Code Playgroud)
所以我确实和一位 WordPress 开发人员交谈过(#40476。$_POST 值 ' 和 \ 肯定是用斜杠转义的),他说:
回到过去,许多个月前,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;
Run Code Online (Sandbox Code Playgroud)
请不要这样做。你只是让自己面临安全问题,以及你的内容发生意外的事情,而 WordPress 确实希望这些值被削减。相反,只需使用wp_unslash()
,如果您确实需要 $_POST 的副本来对自己进行操作,请这样做:$my_POST = wp_unslash( $_POST );
。
我还应该补充一点 - 我希望您这样做是因为您尝试使用 API 端点来执行某些操作,我强烈建议您改用 WordPress 4.7 中引入的 REST API,因为它允许我们提供更多功能为开发人员提供一致的体验。