我不能发布我公司的专有代码,但这里有一些概念代码应该能说明问题。它可能不会没有语法错误。
服务器 1: PHP 5.3.5 , php.ini magic_quotes_gpc = On
(默认)
在这个服务器上,我们使用 PHP 渲染一个页面。该页面有一个带有附加到单击事件的 JavaScript 的按钮。JavaScript 发布到第二台服务器上的 URL,如下所示:
var myURL = "http://server2/AcceptPacket";
var POSTdata = getElementById("JSONdata");
var responsetext = httpPOST(myURL, POSTdata);
...
function httpPOST(myURL, POSTdata) {
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.Open("POST", myURL, false);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send(POSTdata);
return xmlhttp.responsetext;
}
服务器 2:PHP 5.4.9,(从 PHP 5.4 开始删除了魔术引号“功能”)
<?php
$handle=fopen("/tmp/datalog");
foreach($_POST as $vblname => $value) {
$fileData = $value;
fwrite($handle, $fileData . "\n");
}
fclose($handle);
?>
存储的数据/tmp/datalog
是 JSON 数据,但所有引号都用反斜杠转义。这显然像是一个魔术引号问题。事实上,我通过在 server1 上禁用魔术引号并回收 Apache 很容易地解决了这个问题。
但我对它最初是如何崩溃的感到困惑。我在 JavaScript 中的 POST 之前放置了一个“警报”,并且 JSON 似乎没有被转义。但是一旦它到达 server2 并写入磁盘,它就会被转义。服务器 2 有 PHP 5.4.9,所以它甚至没有魔术引号“功能”,实际上它关闭了 server1 上的魔术引号解决了这个问题。很明显,server1 导致了这个问题。
我想不通的是,PHP 魔术引号是如何在我的 JavaScript 代码中的警报和到 server2 的 POST 之间应用的?JavaScript 代码没有在该路径中回调 server1 上的 PHP ...我最好的猜测是,在构建页面时字符已经被转义,并且在 javascript 从页面检索数据之前,并且 JavaScript 警报隐藏了以某种方式从我这里......这可能吗?
可能有一个非常明显的答案,但我对这些东西比较陌生。我希望有人能指出我忽略了什么。