2010-02-23 10 views
26

Estoy tratando de establecer una cookie en una solicitud XSS utilizando XMLHttpRequest.¿Cómo configuro una cookie (encabezado) con XMLHttpRequest en JavaScript?

Encontré el XMLHttpRequest Specification, y la sección 4.6.2-5 parece sugerir que no está permitido configurar Cookie, Cookie2 y algunos otros encabezados, pero esperaba que hubiera una solución alternativa.

Mi código (jQuery) está debajo, pero la consulta resultante falla porque la cookie NO está establecida.

$.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

Respuesta

31

Esto se puede hacer. Es necesario lo siguiente en la llamada $ .ajax: se

xhrFields: { 
    withCredentials: true 
} 

(Consulte la documentación de jQuery), y también necesitará el sitio que está haciendo la solicitud a apoyar CORS (que al menos necesidad de permite su origen y también establecer el Access-Control-Allow-Credentials encabezado HTTP en true).

No hay duda de que funciona. Puedes hacerlo a través de HTTPS, con autenticación básica, etc. jQuery enviará todo (el encabezado de autenticación, las cookies) si le dices (xhrFields) y el sitio proporciona los encabezados CORS correctos. No te rindas!

+1

configuración "withCredentials" agregó todas las cookies de mi dominio a la solicitud xhr. ¡Gracias por la pista! – guido

+1

servidor de notas no puede decir "Access-Control-Allow-Origin: *". Chrome (y sospeche que otros navegadores también) simplemente cancelarán el GET. – Jonno

+1

Abajo la votación ya que tiene la respuesta correcta a la pregunta incorrecta, tenga en cuenta que el OP parece querer establecer una cookie en JavaScript en la solicitud, presumiblemente en el navegador.Cf _I estoy tratando de establecer una cookie en un XSS solicitud usando XMLHttpRequest._ –

13

Por razones de seguridad, no podrá modificar el encabezado durante una solicitud XMLHTTP.

+0

Desafortunadamente, desde mi lectura, este sí parece ser el caso. Gracias por confirmar. – barryred

+0

Esta debería ser la respuesta aceptada, ya que el OP pregunta por establecer una cookie en _request utilizando JavaScript_ y no por que el servidor establezca una cookie en _response_ –

3

Si configura la cookie utilizando document.cookie entonces cuando se envía la solicitud de la cabecera cookie incluirlo.

+0

Hice una serie de tutoriales sobre cookies con uno de ellos sobre el uso javascript y cookies. Comience en http://dbp-consulting.com/tutorials/web/cookieintro.html para aprender sobre las cookies en general y luego tiene enlaces a una página sobre cómo acceder a ellos con javascript desde el navegador y vía php desde el servidor – Patrick

+0

FYI, es interesante observar que algunas plataformas/entornos no parecen compartir document.cookie con XmlHttpRequests (XHR). Como resultado, causa problemas si necesita compartir cookies entre el documento y el XHR, como por ejemplo, la persistencia del estado de la sesión a través de una cookie de sesión. Se descubrió que esto era aparentemente así para las extensiones de navegador Safari y los widgets de Mac OS X. Funciona bien para extensiones de Chrome, gadgets de Windows Vista/7, etc. No sé por qué Apple tenía que ser tan restrictivo. Y lamentablemente nadie tenía una solución o respuesta a mi pregunta de por qué eso es así o cómo solucionarlo. – David

+0

Para agregar a mi comentario anterior, la cookie de sesión (PHPSESSID) se establece en document.cookie (y/o la solicitud XHR inicial para recuperar algunos datos). El XHR posterior para publicar los datos debe pasar a lo largo de esa cookie de sesión. En los gadgets de Chrome y Windows, funcionó bien de forma automática (no es necesario realizar el manejo manual de las cookies). No funcionó en el widget de Safari y Mac OS X. Intenté establecer manualmente el encabezado de solicitud de cookie con document.cookie y no funcionó (aunque no revisé si el documento.cookie tenía la cookie necesaria, que sería un problema aparte con Apple). – David

Cuestiones relacionadas