AJAX-Post-Fehler: Weigert sich, den unsicheren Header "Verbindung" zu setzen

101

Ich habe die folgende benutzerdefinierte Ajax-Funktion, die Daten zurück in eine PHP-Datei sendet. Jedes Mal, wenn Daten gesendet werden, werden die folgenden zwei Fehler angezeigt:

Weigert sich, den unsicheren Header "Inhaltslänge"
festzulegen. Weigert sich, den unsicheren Header "Verbindung" festzulegen.

Code:

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

Was mache ich falsch?

Scharfschütze
quelle
Hey Joey. Ich habe das durchgemacht, bevor ich es hier gepostet habe. Ich verstehe es immer noch nicht. Alles was ich tun muss, ist die setRequestHeader Zeilen zu kommentieren?
Scharfschütze

Antworten:

166

Entfernen Sie diese beiden Zeilen:

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

XMLHttpRequest darf diese Header nicht festlegen, sie werden vom Browser automatisch festgelegt. Der Grund dafür ist, dass Sie durch die Manipulation dieser Header den Server möglicherweise dazu verleiten können, eine zweite Anforderung über dieselbe Verbindung anzunehmen, die nicht die üblichen Sicherheitsüberprüfungen durchläuft - dies wäre eine Sicherheitslücke im Browser.

Wladimir Palant
quelle
5
Welche "Verwundbarkeit" Connection: closeverursacht? Wenn Sie wissen, dass eine Anforderung lange dauert, sollte es möglich sein, anzufordern, dass die dauerhafte Verbindung nicht hergestellt wird. Browser unterstützen auch kein Anforderungs-Pipelining. Wenn also eine lang laufende Anforderung vor einer normalen Anforderung steht, wird die zweite Anforderung für die gesamte Keepalive-Zeit blockiert. Wenn die lang laufende Anforderung "Verbindung: Schließen" verwenden könnte, könnte angefordert werden, dass die dauerhafte Verbindung nicht gebunden wird und beispielsweise eine unnötige Verzögerung von 5 Sekunden verursacht wird (wobei 5 Sekunden die Keep-Alive-Zeit sind).
Doug65536
3
@ doug65536: Browser validieren keine Header-Werte, sie verbieten einfach das Setzen von Headern, mit denen Sie sich nicht anlegen sollten.
Wladimir Palant
Hallo Wladimir, wie übergebe ich meinen Parameter, wenn diese 2 Zeilen entfernt werden?
coderInrRain
@anunixercoder: Das tust du nicht. Diese beiden Header werden vom Browser automatisch festgelegt und können nicht geändert werden.
Wladimir Palant
Betreff: "Es sollte möglich sein, zu verlangen, dass die dauerhafte Verbindung nicht hergestellt wird." - das ist nicht was | Verbindung: schließen | tut.
EricLaw