1

我不能发布我公司的专有代码,但这里有一些概念代码应该能说明问题。它可能不会没有语法错误。

服务器 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 警报隐藏了以某种方式从我这里......这可能吗?

可能有一个非常明显的答案,但我对这些东西比较陌生。我希望有人能指出我忽略了什么。

4

0 回答 0