Błąd publikacji AJAX: odmówiono ustawienia niebezpiecznego nagłówka „Połączenie”


101

Mam następującą niestandardową funkcję Ajax, która wysyła dane z powrotem do pliku PHP. Za każdym razem, gdy dzieje się przesyłanie danych, otrzymuję następujące dwa błędy:

Odmówiono ustawienia niebezpiecznego nagłówka „Długość treści”
Odmowa ustawienia niebezpiecznego nagłówka „Połączenie”

Kod :

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);
 }

Co ja robię źle?



Hej Joey. Przejrzałem to, zanim opublikowałem to tutaj. Nadal nie rozumiem. Wszystko, co muszę zrobić, to skomentować wiersze setRequestHeader?
snajper

Odpowiedzi:


166

Usuń te dwie linie:

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

XMLHttpRequest nie może ustawić tych nagłówków, są one ustawiane automatycznie przez przeglądarkę. Powodem jest to, że manipulując tymi nagłówkami, możesz skłonić serwer do przyjęcia drugiego żądania za pośrednictwem tego samego połączenia, takiego, które nie przeszłoby zwykłych kontroli bezpieczeństwa - byłaby to luka w zabezpieczeniach przeglądarki.


5
Jaka „luka” Connection: closepowoduje? Jeśli wiesz, że żądanie zajmie dużo czasu, powinno być możliwe zażądanie, aby nie blokowało stałego połączenia. Przeglądarki również nie obsługują potokowania żądań, więc jeśli długo działające żądanie pojawi się przed normalnym żądaniem, zablokuje drugie żądanie przez cały czas utrzymywania aktywności. Gdyby długo działające żądanie mogło używać opcji „Połączenie: zamknij”, byłoby możliwe zażądanie, aby nie wiązało trwałego połączenia i powodowało (na przykład) niepotrzebne 5-sekundowe opóźnienie (gdzie 5 sekund to czas utrzymywania aktywności).
doug65536

3
@ doug65536: Przeglądarki nie sprawdzają poprawności wartości nagłówków, po prostu zabraniają ustawiania nagłówków, z którymi nie powinieneś zadzierać.
Wladimir Palant

Cześć Wladimir, jak mogę przekazać mój parametr, jeśli te 2 linie zostaną usunięte?
coderInrRain

@anunixercoder: Ty nie. Te dwa nagłówki są ustawiane automatycznie przez przeglądarkę i nie można ich zmienić.
Wladimir Palant

Re: "powinno być możliwe zażądanie, aby nie wiązało trwałego połączenia." - nie o to chodzi | Połączenie: blisko | robi.
EricLaw
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.