2010-02-23 12 views
26

Sto tentando di impostare un cookie in una richiesta XSS utilizzando XMLHttpRequest.Come imposto un cookie (intestazione) con XMLHttpRequest in JavaScript?

Ho trovato XMLHttpRequest Specification e la sezione 4.6.2-5 sembra suggerire che l'impostazione Cookie, Cookie2 e alcune altre intestazioni non sono consentite, ma speravo ci fosse un lavoro in giro.

Il mio codice (jQuery) è inferiore, ma la query risultante non riesce poiché il cookie NON è impostato.

$.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- nome-intestazione – Knu

risposta

31

Questo può essere fatto. È necessario il seguente nella chiamata $ .ajax:

xhrFields: { 
    withCredentials: true 
} 

(Vedere la documentazione jQuery), e avrete anche bisogno di sito che si sta facendo la richiesta di sostenere CORS (saranno almeno necessità di consentire l'origine e anche impostare l'intestazione HTTP Access-Control-Allow-Credentials su true).

Non c'è dubbio che funzioni. Puoi farlo tramite HTTPS, con Basic Auth, ecc. JQuery invierà tutto (l'header auth, cookie) se lo dici a (xhrFields) e il sito fornisce le intestazioni CORS corrette. Non arrenderti!

+1

"withCredentials" ha aggiunto tutti i cookie del mio dominio alla richiesta xhr. Grazie per il suggerimento! Il server delle note – guido

+1

non può dire "Access-Control-Allow-Origin: *". Chrome (e sospetto anche altri browser) semplicemente annullerebbe il GET. – Jonno

+1

Giù al voto, dato che hai la risposta corretta alla domanda sbagliata, nota che l'OP sembra voler impostare un cookie in JavaScript sulla richiesta, presumibilmente nel browser. _ Sto cercando di impostare un cookie in un XSS richiesta utilizzando XMLHttpRequest._ –

13

Per motivi di sicurezza, non sarà possibile modificare l'intestazione durante un XMLHTTPRequest.

+0

Sfortunatamente, dalla mia lettura, sembra proprio che sia così. Grazie per la conferma. – barryred

+0

Questa dovrebbe essere la risposta accettata poiché l'OP sta chiedendo di impostare un cookie sul _request utilizzando JavaScript_ e non per il server per impostare un cookie sulla _response_ –

0

Se la richiesta allo stesso dominio come codice jQuery, è possibile utilizzare jQuery cookies plugin

3

Se si imposta il cookie usando document.cookie poi, quando si invia la richiesta l'intestazione cookie includerlo.

+0

Ho fatto un set di tutorial sui cookie con uno di loro che stava solo usando javascript e cookie. Inizia da http://dbp-consulting.com/tutorials/web/cookieintro.html per conoscere i cookie in generale e poi ha collegamenti a una pagina sull'accesso con javascript dal browser e tramite php dal server – Patrick

+0

FYI, è interessante notare che alcune piattaforme/ambienti non sembrano condividere document.cookie con XmlHttpRequests (XHR). Di conseguenza, genera problemi se è necessario condividere i cookie tra il documento e XHR, come ad esempio la persistenza dello stato di sessione tramite un cookie di sessione. Questo è stato trovato apparentemente così per le estensioni del browser Safari e i widget di Mac OS X. Funziona bene per le estensioni di Chrome, i dispositivi Windows Vista/7, ecc. Non so perché Apple debba essere così restrittiva. E purtroppo nessuno ha avuto una soluzione o una risposta alla mia domanda sul perché sia ​​così o su come risolverlo. – David

+0

Per aggiungere al mio commento precedente, il cookie di sessione (PHPSESSID) è impostato in document.cookie (e/o richiesta XHR iniziale per recuperare alcuni dati). Il successivo XHR per postare i dati dovrebbe passare lungo quel cookie di sessione. Nel gadget Chrome e Windows, questo funzionava perfettamente (non è necessario eseguire la gestione manuale dei cookie). Non ha funzionato nei widget Safari e Mac OS X. Ho provato a impostare manualmente l'intestazione della richiesta del cookie con document.cookie e non ha funzionato (anche se non ho controllato il documento.cookie aveva il cookie necessario, che sarebbe un problema separato con Apple). L'impostazione – David

Problemi correlati