为什么在这种情况下应用了魔术引号?

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

服务器1:PHP 5.3.5 ,php.ini magic_quotes_gpc = On (默认)

在这个服务器上,我们使用PHP呈现一个页面。 该页面有一个JavaScript附加到click事件的按钮。 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中的/tmp/datalog是JSON数据,但它已将所有引号用反斜线转义。 这显然是一个神奇的引号问题。 事实上,我通过在server1上禁用了魔术引号,并且回收了Apache,我很容易地解决了这个问题。

但我对于它如何打破头绪感到困惑。 我在JavaScript之前的POST中放入了一个'alert',并且JSON似乎没有被转义。 但一旦到达server2并写入磁盘,它就会被转义。 服务器2的PHP 5.4.9,所以它甚至没有魔术引号的'功能',实际上它关闭了服务器1上的魔术引号来解决问题。 很明显,server1导致了这个问题。

我无法弄清楚的是,在我的JavaScript代码中的警报和POST到server2之间,PHP魔术引号是如何应用的? JavaScript代码不会在那个路径的server1上回调给PHP ...我最好的猜测是,当页面被构建时,以及在JavaScript从页面获取数据之前,字符已经被转义,并且JavaScript警报隐藏不知从哪里来......这可能吗?

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

链接地址: http://www.djcxy.com/p/26571.html

上一篇: Why are magic quotes being applied in this scenario?

下一篇: Best method of disabling php magic quotes without php.ini or .htaccess