Помилка публікації AJAX: Відмовлено у встановленні небезпечного заголовка "З'єднання"


101

У мене є така спеціальна функція ajax, яка надсилає дані назад у файл PHP. Щоразу, коли трапляється публікація даних, я отримую такі дві помилки:

Відмовлено у встановленні небезпечного заголовка "Довжина вмісту"
Відмовлено у встановленні небезпечного заголовка "З'єднання"

Код:

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викликає? Якщо ви знаєте, що запит триватиме тривалий час, слід вимагати, щоб він не зв’язував стійке з'єднання. Браузери також не підтримують конвеєрний запит, тож якщо тривалий запит надходить до звичайного запиту, він блокує 2-й запит протягом повного часу очікування. Якщо тривалий запит може використовувати "З'єднання: закрити", можна було б попросити, щоб він не зв’язував стійке з'єднання і викликав (наприклад) непотрібну затримку на 5 секунд (де 5 секунд - час збереження).
doug65536

3
@ doug65536: Веб-переглядачі не підтверджують значення заголовка, вони просто забороняють заголовки налаштувань, з якими ви не повинні зіпсуватись.
Володимир Палант

Привіт Владимире, як я можу передати свій параметр, якщо ці 2 рядки видалено?
coderInrRain

@anunixercoder: Ні. Ці два заголовки встановлюються браузером автоматично, і їх неможливо змінити.
Володимир Палант

Re: "слід мати можливість вимагати, щоб він не зв'язував стійке з'єднання". - це не те, що | З'єднання: закрити | робить.
EricLaw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.