Ошибка сообщения AJAX: отказано в установке небезопасного заголовка «Соединение»


101

У меня есть следующая настраиваемая функция ajax, которая отправляет данные обратно в файл PHP. Каждый раз, когда происходит публикация данных, я получаю следующие две ошибки:

Отказано в установке небезопасного заголовка "Content-length"
Отказано в установке небезопасного заголовка "Connection"

Код:

function passposturl(url1, params, obj)
{
    //url1 = url1+"&sid="+Math.random();
    xmlHttp = get_xmlhttp_obj();
    xmlHttp.loadflag = obj;
    xmlHttp.open("POST", url1, true);
    //alert(url1);
    //alert(params);
    //alert(obj);
    //alert(params.length);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.onreadystatechange = function ()
    {
        stateChanged(xmlHttp);
    };
    xmlHttp.send(params);
 }

Что я делаю не так?



Привет, Джоуи. Я прошел через это, прежде чем опубликовать здесь. Я все еще не понимаю. Все, что мне нужно сделать, это прокомментировать строки setRequestHeader?
снайпер

Ответы:


166

Удалите эти две строки:

xmlHttp.setRequestHeader("Content-length", params.length);
xmlHttp.setRequestHeader("Connection", "close");

XMLHttpRequest не может устанавливать эти заголовки, они автоматически устанавливаются браузером. Причина в том, что, манипулируя этими заголовками, вы можете обманом заставить сервер принять второй запрос через то же соединение, не проходящий обычные проверки безопасности - это будет уязвимостью безопасности в браузере.


5
Какая «уязвимость» Connection: closeвызывает? Если вы знаете, что запрос займет много времени, должна быть возможность запросить, чтобы он не прерывал постоянное соединение. Браузеры также не поддерживают конвейерную обработку запросов, поэтому, если длительный запрос поступает раньше обычного, он блокирует второй запрос на все время поддержки активности. Если бы длительный запрос мог использовать «Соединение: закрыть», тогда можно было бы запросить, чтобы он не прерывал постоянное соединение и не вызывал (например) ненужную 5-секундную задержку (где 5 секунд - это время поддержания активности).
doug65536

3
@ doug65536: Браузеры не проверяют значения заголовков, они просто запрещают установку заголовков, с которыми вам не следует связываться.
Владимир Палант

Привет, Владимир! Как передать свой параметр, если эти 2 строки удалены?
coderInrRain

@anunixercoder: Нет. Эти два заголовка устанавливаются браузером автоматически и не могут быть изменены.
Владимир Палант

Re: «Должна быть возможность запросить, чтобы он не прерывал постоянное соединение». - это не то | Подключение: закрыть | делает.
EricLaw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.