WebKit "Отказ от установки небезопасного заголовка 'content-length'" - PullRequest
47 голосов
/ 12 апреля 2010

Я пытаюсь реализовать простую абстракцию xhr и получаю это предупреждение, когда пытаюсь установить заголовки для POST. Я думаю, что это может быть связано с установкой заголовков в отдельном файле js, потому что, когда я устанавливал их в теге <script> в файле .html, он работал нормально. Запрос POST работает нормально, но я получаю это предупреждение, и мне любопытно, почему. Я получаю это предупреждение для заголовков content-length и connection, но только в браузерах WebKit (бета-версия Chrome 5 и Safari 4). В Firefox я не получаю никаких предупреждений, заголовок Content-Length установлен на правильное значение, но Connection установлен для поддержания активности вместо закрытия, что заставляет меня думать, что он также игнорирует мои вызовы 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;
}

1 Ответ

63 голосов
/ 12 апреля 2010

он также игнорирует мои вызовы setRequestHeader и генерирует собственный

Да, стандарт говорит, что должен:

По соображениям безопасности эти шаги следует прекратить, если заголовок [...]

  • Подключение
  • Длина содержимого

Возникновение с ними может обнажить различные запросы на контрабанду атак, поэтому браузер всегда использует собственные значения. Нет необходимости или причины пытаться установить длину запроса, так как браузер может точно это сделать, исходя из длины передаваемых данных до send().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...