Errore post AJAX: rifiutato di impostare un'intestazione non sicura "Connessione"


101

Ho la seguente funzione ajax personalizzata che invia i dati a un file PHP. Ogni volta che avviene il caricamento dei dati, ricevo i seguenti due errori:

Rifiutato di impostare l'intestazione non sicura "Lunghezza del contenuto"
Rifiutato di impostare l'intestazione non sicura "Connessione"

Codice :

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

Che cosa sto facendo di sbagliato?



Hey Joey. L'ho esaminato prima di pubblicarlo qui. Continuo a non capirlo. Tutto quello che devo fare è commentare le righe setRequestHeader?
cecchino

Risposte:


166

Rimuovi queste due righe:

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

XMLHttpRequest non è autorizzato a impostare queste intestazioni, vengono impostate automaticamente dal browser. Il motivo è che manipolando queste intestazioni potresti essere in grado di indurre il server ad accettare una seconda richiesta tramite la stessa connessione, una che non passerebbe attraverso i soliti controlli di sicurezza: sarebbe una vulnerabilità di sicurezza nel browser.


5
Quale "vulnerabilità" Connection: closecausa? Se sai che una richiesta richiederà molto tempo, dovrebbe essere possibile richiedere che non blocchi la connessione persistente. Anche i browser non supportano il pipelining delle richieste, quindi se una richiesta di lunga durata viene prima di una richiesta normale, bloccherà la seconda richiesta per tutto il tempo di keepalive. Se la richiesta a esecuzione prolungata potesse utilizzare "Connessione: chiudi" allora sarebbe possibile richiedere che non blocchi la connessione persistente e causi (ad esempio) un ritardo di 5 secondi non necessario (dove 5 secondi è il tempo di mantenimento).
doug65536

3
@ doug65536: i browser non convalidano i valori di intestazione, semplicemente disabilitano l'impostazione di intestazioni con cui non dovresti scherzare.
Wladimir Palant

Ciao Wladimir, come passo il mio parametro se quelle 2 linee vengono rimosse?
coderInrRain

@anunixercoder: non lo fai. Queste due intestazioni vengono impostate automaticamente dal browser e non possono essere modificate.
Wladimir Palant

Oggetto: "dovrebbe essere possibile richiedere che non blocchi la connessione persistente." - non è quello | Connection: close | fa.
EricLaw
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.