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

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)

  • 我总是喜欢`$ _POST = array_map('stripslashes',$ _POST);` (6认同)

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复制POST变量为自己的用途,然后逃避它们可以很容易地避免而不是改变POST中的实际内容,而wordpress之外的任何内容都必须处理这些变化. (2认同)
  • 与wp dev交谈:`$ myvar = wp_unslash($ _POST ['variable']); 或$ my_POST = wp_unslash($ _POST); 我担心这两种情况都无法解决 (2认同)

Mat*_*chu 9

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

在php.ini中很容易禁用愚蠢的麻烦.


Tos*_*kan 5

所以我确实和一位 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,因为它允许我们提供更多功能为开发人员提供一致的体验。