web-dev-qa-db-ja.com

WebKit「安全でないヘッダー 'content-length'の設定を拒否しました」

単純なxhr抽象化を実装しようとしていますが、POSTのヘッダーを設定しようとするとこの警告が表示されます。ヘッダーを個別のjsファイルに設定することと関係があると思います。なぜなら、<script>タグの.htmlファイルで、正常に機能しました。 POSTリクエストは正常に機能していますが、この警告が表示され、その理由が不思議です。この警告は両方のcontent-lengthおよびconnectionヘッダー、ただしWebKitブラウザーのみ(Chrome 5ベータ版およびSafari 4)。 Firefoxでは、警告は表示されず、Content-Lengthヘッダーは正しい値に設定されますが、Connectionはcloseではなくkeep-aliveに設定されます。これにより、setRequestHeader呼び出しを無視してそれは自分のものです。 IEでこのコードを試したことはありません。マークアップとコードは次のとおりです。

test.html

<!DOCTYPE html>
<html>
    <head>
        <script src="jsfile.js"></script>
        <script>
            var request = new Xhr('POST', 'script.php', true, 'data=somedata',  function(data) { 
                console.log(data.text); 
            });
        </script>
    </head>
    <body>
    </body>
</html>

jsfile.js

function Xhr(method, url, async, data, callback) {
    var x;
    if(window.XMLHttpRequest) {
        x = new XMLHttpRequest();

        x.open(method, url, async);

        x.onreadystatechange = function() {
            if(x.readyState === 4) {
                if(x.status === 200) {
                    var data = {
                        text: x.responseText,
                        xml: x.responseXML
                    };
                    callback.call(this, data);
                }
            }
        }

        if(method.toLowerCase() === "post") {
            x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            x.setRequestHeader("Content-Length", data.length);
            x.setRequestHeader("Connection", "close");
        }

        x.send(data);
    } else {
        // ... implement IE code here ...
    }
    return x;
}
47
Paul Woolcock

また、setRequestHeader呼び出しを無視し、独自の呼び出しを生成しています

はい、 標準 は次のことを示す:

セキュリティ上の理由から、ヘッダーが[...]の場合、これらの手順は終了する必要があります

  • 接続
  • コンテンツ長

それらをいじると、さまざまな request smuggling 攻撃が公開される可能性があるため、ブラウザは常に独自の値を使用します。ブラウザーがsend()に渡すデータの長さから正確にそれを行うことができるので、要求の長さを設定しようとする必要も理由もありません。

63
bobince