1

会社独自のコードを投稿することはできませんが、要点を理解するための概念コードをいくつか示します。構文エラーがない可能性があります。

サーバー 1: PHP 5.3.5、 php.ini magic_quotes_gpc = On(デフォルト)

このサーバーでは、PHP を使用してページをレンダリングします。ページには、クリック イベントに関連付けられた JavaScript を含むボタンがあります。JavaScript は、次のような 2 番目のサーバー上の 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 があるため、マジック クォートの「機能」さえありません。実際、サーバー 1 でマジック クォートをオフにすることで問題が解決しました。明らかに、server1 が問題の原因でした。

私が理解できないのは、JavaScript コードのアラートと server2 への POST の間に PHP のマジック クォートがどのように適用されたのかということです。JavaScript コードは、そのパスで server1 の PHP にコールバックしていません...私の推測では、ページが作成されたとき、JavaScript がページからデータを取得する前に、文字は既にエスケープされており、JavaScript アラートが非表示になっていると思われます。それは私からどういうわけか...それは可能ですか?

おそらく本当に明白な答えがあるでしょうが、私はこのようなことに比較的慣れていません。誰かが私が見落としていることを指摘してくれることを願っています。

4

0 に答える 0