withcredentials - ¿Cómo funcionan las cookies de HttpOnly con las solicitudes de AJAX?




send cookie ajax request (6)

JavaScript necesita acceso a las cookies si se utiliza AJAX en un sitio con restricciones de acceso basadas en cookies. ¿Funcionarán las cookies HttpOnly en un sitio AJAX?

Editar: Microsoft creó una forma de evitar ataques XSS al no permitir el acceso de JavaScript a las cookies si se especifica HttpOnly. FireFox luego adoptó esto. Entonces mi pregunta es: si está utilizando AJAX en un sitio, como StackOverflow, ¿son las cookies de Http-Only una opción?

Edición 2: Pregunta 2. Si el propósito de HttpOnly es evitar el acceso de JavaScript a las cookies, y aún puede recuperar las cookies a través de JavaScript a través del Objeto XmlHttpRequest, ¿cuál es el sentido de HttpOnly ?

Edición 3: Aquí hay una cita de Wikipedia:

Cuando el navegador recibe dicha cookie, se supone que debe usarla como de costumbre en los siguientes intercambios HTTP, pero no para hacerla visible en los scripts del lado del cliente. [32] El indicador HttpOnly no forma parte de ningún estándar y no está implementado en todos los navegadores. Tenga en cuenta que actualmente no hay prevención de leer o escribir la cookie de sesión a través de XMLHTTPRequest. [33].

Entiendo que document.cookie está bloqueado cuando usa HttpOnly. Pero parece que todavía puede leer valores de cookies en el objeto XMLHttpRequest, lo que permite XSS. ¿Cómo HttpOnly te hace más seguro que? ¿Al hacer que las cookies sean esencialmente de solo lectura?

En su ejemplo, no puedo escribir en su document.cookie , pero aún puedo robar su cookie y publicarla en mi dominio utilizando el objeto XMLHttpRequest.

<script type="text/javascript">
    var req = null;
    try { req = new XMLHttpRequest(); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    req.open('GET', 'http://stackoverflow.com/', false);
    req.send(null);
    alert(req.getAllResponseHeaders());
</script>

Editar 4: Lo siento, quise decir que podría enviar XMLHttpRequest al dominio de StackOverflow, y luego guardar el resultado de getAllResponseHeaders () en una cadena, eliminar la cookie y publicarla en un dominio externo. Parece que Wikipedia y los hackers están de acuerdo conmigo en esto, pero me encantaría que me reeduquen ...

Edición final: Ahh, aparentemente ambos sitios están equivocados, esto es realmente un error en Firefox . IE6 y 7 son en realidad los únicos navegadores que actualmente son totalmente compatibles con HttpOnly.

Para reiterar todo lo que he aprendido:

  • HttpOnly restringe todo el acceso a document.cookie en IE7 y Firefox (no estoy seguro acerca de otros navegadores)
  • HttpOnly elimina la información de cookies de los encabezados de respuesta en XMLHttpObject.getAllResponseHeaders () en IE7.
  • XMLHttpObjects solo se puede enviar al dominio del que se originaron, por lo que no se publican cookies entre dominios.

editar: esta información probablemente ya no esté actualizada.


Por lo tanto, supongo que JavaScript necesita acceso a sus cookies.

Todas las solicitudes HTTP de su navegador transmiten su información de cookies para el sitio en cuestión. JavaScript puede establecer y leer cookies. Las cookies no son por definición necesarias para las aplicaciones Ajax, pero se requieren para la mayoría de las aplicaciones web para mantener el estado del usuario.

La respuesta formal a su pregunta formulada: "¿Necesita JavaScript acceso a las cookies si se usa AJAX?" - Por lo tanto, es "no". Piense en campos de búsqueda mejorados que usan solicitudes de Ajax para proporcionar opciones de sugerencia automática, por ejemplo. No hay necesidad de información de cookies en ese caso.


Como aclaración: desde la perspectiva del servidor, la página solicitada por una solicitud AJAX no es esencialmente diferente a una solicitud de obtención de HTTP estándar realizada por el usuario haciendo clic en un enlace. Todas las propiedades de solicitud normales: user-agent, ip, session, cookies, etc. se pasan al servidor.


Las cookies son manejadas automáticamente por el navegador cuando realiza una llamada AJAX, por lo que no es necesario que su Javascript juegue con las cookies.


No necesariamente, depende de lo que quieras hacer. Podrías elaborar un poco? AJAX no necesita acceso a cookies para trabajar, puede realizar solicitudes por sí mismo para extraer información, la solicitud de la página que hace la llamada AJAX podría acceder a los datos de la cookie y pasarla al script de llamadas sin que Javascript tenga que acceder directamente al galletas


Sí, las cookies HTTP-only estarían bien para esta funcionalidad. Se les proporcionará la solicitud de XmlHttpRequest al servidor.

En el caso de , las cookies se proporcionan automáticamente como parte de la solicitud XmlHttpRequest. No conozco los detalles de implementación del proveedor de autenticación de desbordamiento de pila, pero es probable que los datos de cookie se utilicen automáticamente para verificar su identidad en un nivel inferior al método de control de "votación".

De manera más general, las cookies no son necesarias para AJAX. El soporte de XmlHttpRequest (o incluso si es remoto, en navegadores más antiguos) es todo lo que se requiere técnicamente.

Sin embargo, si desea proporcionar seguridad para la funcionalidad habilitada para AJAX, entonces se aplican las mismas reglas que con los sitios tradicionales. Necesita algún método para identificar al usuario detrás de cada solicitud, y las cookies casi siempre son el medio para ese fin.

En su ejemplo, no puedo escribir en su document.cookie, pero aún puedo robar su cookie y publicarla en mi dominio utilizando el objeto XMLHttpRequest.

XmlHttpRequest no realizará solicitudes de dominios cruzados (exactamente por el tipo de razones por las que está tocando).

Normalmente, puede insertar una secuencia de comandos para enviar la cookie a su dominio utilizando iframe remoto o JSONP, pero luego HTTP-Only protege la cookie nuevamente ya que es inaccesible.

A menos que haya comprometido .com en el lado del servidor, no podrá robar mi cookie.

Edit 2: Question 2. Si el propósito de Http-Only es evitar el acceso de JavaScript a las cookies, y aún puede recuperar las cookies a través de JavaScript a través del objeto XmlHttpRequest, ¿cuál es el punto de Http-Only?

Considera este escenario:

  • Encuentro una vía para inyectar código JavaScript en la página.
  • Jeff carga la página y mi JavaScript malicioso modifica su cookie para que coincida con la mía.
  • Jeff envía una respuesta estelar a tu pregunta.
  • Como él lo envía con mis datos de cookies en lugar de los suyos, la respuesta será mía.
  • Usted vota "mi" respuesta estelar.
  • Mi cuenta real entiende el punto.

Con las cookies HTTP-Only, el segundo paso sería imposible y, por lo tanto, se vencería mi intento de XSS.

Editar 4: Lo siento, quise decir que podría enviar XMLHttpRequest al dominio de , y luego guardar el resultado de getAllResponseHeaders () en una cadena, eliminar la cookie y publicarla en un dominio externo. Parece que Wikipedia y los hackers están de acuerdo conmigo en esto, pero me encantaría que me reeduquen ...

Eso es correcto. Todavía puedes secuestrar la sesión de esa manera. Sin embargo, reduce significativamente el rebaño de personas que pueden ejecutar con éxito incluso el ataque de XSS en tu contra.

Sin embargo, si vuelve a mi escenario de ejemplo, puede ver dónde HTTP-Only corta con éxito los ataques XSS que se basan en la modificación de las cookies del cliente (no poco común).

Todo se reduce al hecho de que a) ninguna mejora individual resolverá todas las vulnerabilidades yb) ningún sistema será completamente seguro. HTTP-Only es una herramienta útil para apuntalar contra XSS.

Del mismo modo, aunque la restricción de dominio cruzado en XmlHttpRequest no es 100% exitosa en la prevención de todos los exploits XSS, nunca soñarías con eliminar la restricción.


Sí, las cookies son muy útiles para Ajax.

Poner la autenticación en la URL de solicitud es una mala práctica. Hubo una noticia la semana pasada sobre cómo obtener los tokens de autenticación en las URL de la memoria caché de google.

No, no hay forma de prevenir ataques. Los navegadores antiguos aún permiten el acceso trivial a las cookies a través de javascript. Puede omitir solo http, etc. Cualquier cosa que se le ocurra puede conseguirse con suficiente esfuerzo. El truco es hacer demasiado esfuerzo para que valga la pena.

Si desea que su sitio sea más seguro (no existe una seguridad perfecta) puede usar una cookie de autenticación que caduque. Luego, si la cookie es robada, el atacante debe usarla antes de que caduque. Si no lo hacen, entonces tiene una buena indicación de que hay actividad sospechosa en esa cuenta. Cuanto más corta sea la ventana de tiempo, mejor es para la seguridad, pero cuanto más carga pone en su servidor la generación y el mantenimiento de las claves.





httponly