2010-02-23 13 views
26

Ich versuche, ein Cookie in einer XSS-Anfrage mit XMLHttpRequest zu setzen.Wie setze ich einen Cookie (Header) mit XMLHttpRequest in JavaScript?

Ich fand die XMLHttpRequest Specification, und Abschnitt 4.6.2-5 scheint darauf hinzuweisen, dass die Einstellung Cookie, Cookie2 und einige andere Header nicht erlaubt sind, aber ich hatte gehofft, dass es eine Arbeit gab.

Mein (jQuery) Code ist unten, aber die resultierende Abfrage schlägt fehl, da der Cookie NICHT gesetzt ist.

$.ajax({ 
    type : "POST", 
    url : URL, 
    data: SOAP_INBOX_MAIL_QUERY, 
    dataType : "xml", 
    async: false, 
    beforeSend : function(xhr) { 
    var cookie = credentials["COOKIE"]; 
    console.info("adding cookie: "+ cookie);   
    xhr.setRequestHeader('Cookie', cookie); 
    }, 
    success : function(data, textStatus, xmLHttpRequest){ 


    }, 
    error : function(xhr, ajaxOptions, thrownError) { 
    credentials = null; 
    } 
}); 
+1

https://fetch.spec.whatwg.org/#forbidden- Header-Name – Knu

Antwort

31

Dies kann getan werden. Sie müssen die folgenden in der $ Schnipsel Aufruf:

xhrFields: { 
    withCredentials: true 
} 

(Siehe jQuery docs), und Sie müssen auch die Website, die Sie die Anforderung stellen, CORS zu unterstützen (sie werden zumindest Notwendigkeit, Erlaube dir die Herkunft und setze auch den Access-Control-Allow-Credentials HTTP-Header auf true).

Es ist keine Frage, es funktioniert. Sie können dies über HTTPS, mit Basic Auth, etc. tun. JQuery sendet alles (den Auth-Header, Cookies), wenn Sie es an (xhrFields) mitteilen und die Site die richtigen CORS-Header bereitstellt. Gib nicht auf!

+1

Einstellung "withCredentials" hinzugefügt alle Cookies meiner Domäne der XHR-Anfrage. Danke für den Tipp! – guido

+1

Notizserver kann nicht "Access-Control-Allow-Origin: *" sagen. Chrome (und vermutlich auch andere Browser) würde einfach das GET abbrechen. – Jonno

+1

Down Voting, wie Sie die richtige Antwort auf die falsche Frage haben, beachten Sie, dass das OP scheint ein Cookie in JavaScript auf der Anfrage, vermutlich im Browser zu setzen.Cf _I versuchen, ein Cookie in einem XSS setzen Anfrage mit XMLHttpRequest._ –

13

Aus Sicherheitsgründen können Sie die Kopfzeile während einer XMLHTTPRequest nicht ändern.

+0

Leider scheint dies aus meiner Lektüre tatsächlich der Fall zu sein. Danke für die Bestätigung. – barryred

+0

Dies sollte die akzeptierte Antwort sein, da das OP nach dem Setzen eines Cookies auf dem _request mittels JavaScript_ fragt und nicht nach dem Setzen eines Cookies auf dem _response_ –

3

verwenden Wenn Sie das Cookie mit document.cookie dann festgelegt, wenn Sie die Anforderung der Cookie-Header wird es gehören senden.

+0

Ich habe eine Reihe von Tutorials zu Cookies gemacht, von denen eines gerade benutzt wird Javascript und Cookies. Beginnen Sie bei http://dbp-consulting.com/tutorials/web/cookieeintro.html, um über Cookies im Allgemeinen zu lernen, und dann hat es Links zu einer Seite über den Zugriff auf sie mit Javascript aus dem Browser und über PHP vom Server – Patrick

+0

FYI, Es ist interessant zu bemerken, dass einige Plattformen/Umgebungen document.cookie nicht mit XmlHttpRequests (XHR) teilen. Dies hat zur Folge, dass Probleme auftreten, wenn Sie Cookies zwischen dem Dokument und dem XHR freigeben müssen, z. B. die Persistenz des Sitzungsstatus über einen Sitzungscookie. Dies wurde anscheinend für Safari-Browsererweiterungen und Mac OS X-Widgets gefunden. Funktioniert gut für Chrome-Erweiterungen, Windows Vista/7-Gadgets usw. Ich weiß nicht, warum Apple so restriktiv sein musste. Und leider hatte niemand eine Lösung oder Antwort auf meine Frage, warum das so ist oder wie man es umgehen kann. – David

+0

Um zu meinem vorherigen Kommentar hinzuzufügen, wird der (PHPSESSID) Sitzungscookie in document.cookie (und/oder initialer XHR-Anfrage zum Abrufen einiger Daten) gesetzt. Nachfolgendes XHR zum Zurücksetzen von Daten sollte diesen Sitzungscookie weitergeben. Im Chrome- und Windows-Gadget funktionierte das automatisch einwandfrei (manuelle Cookie-Behandlung nicht erforderlich). Es hat nicht in Safari und Mac OS X Widget funktioniert. Ich habe versucht, Cookie-Anfrage Header mit document.cookie manuell gesetzt und hat nicht funktioniert (obwohl ich nicht überprüft, ob Dokument.Cookie hatte den benötigten Cookie, was bei Apple ein separates Problem wäre). – David

Verwandte Themen