我无法发布我公司的专有代码,但这里有一些概念代码可以解决问题。它可能没有语法错误。
服务器1:PHP 5.3.5 ,php.ini magic_quotes_gpc = On
(默认)
在此服务器上,我们使用PHP呈现页面。该页面有一个按钮,其中包含附加到click事件的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导致了这个问题。
我无法弄清楚的是,我的JavaScript代码中的警报和服务器2的POST之间是如何应用PHP魔术引号的? JavaScript代码在该路径中没有回调服务器1上的PHP ...我最好的猜测是,在构建页面时,以及在javascript从页面检索数据之前,角色已经被转义,并且JavaScript警报已隐藏那个来自我的......那可能吗?
可能有一个非常明显的答案,但我对这些东西比较新。我希望有人可以指出我忽略的东西。