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?¿Cómo funcionan las cookies de HttpOnly con las solicitudes de AJAX?
Editar: Microsoft creó una forma de evitar los 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 para evitar el acceso a las cookies de JavaScript, y todavía se puede recuperar las galletas a través de JavaScript a través del objeto XMLHttpRequest, ¿cuál es el punto de HttpOnly?
Datos 3: Aquí es una cita de Wikipedia:
Cuando el navegador recibe una cookie tal, que se supone que lo utilizan como es habitual en los siguientes intercambios HTTP, pero no para que sea visible a 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 utiliza 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 sentimos, quería decir que usted podría enviar el XMLHttpRequest para el dominio Stackoverflow, y luego guardar el resultado de getAllResponseHeaders() en una cadena, la expresión regular a cabo la cookie, y luego puesto que a un dominio externo. Parece que Wikipedia y ha.ckers coinciden conmigo en esto, pero me encantaría ser re-educado ...
edición final: Ahh, al parecer, ambos sitios están mal, esto es en realidad un bug in FireFox. IE6 & 7 son en realidad los únicos navegadores que actualmente son totalmente compatibles con HttpOnly.
Reiterar todo lo que he aprendido:
- HttpOnly restringe el acceso a todos los document.cookie en IE7 y Firefox & (no estoy seguro acerca de otros navegadores)
- HttpOnly elimina información de la cookie de las cabeceras de respuesta en XMLHttpObject.getAllResponseHeaders() en IE7.
- Los XMLHttpObjects solo se pueden enviar al dominio del que se originaron, por lo que no se publican cookies entre dominios.
editar: Esta información probablemente no esté más actualizada.
Lancé su ejemplo en un script de greasemonkey y parece que FF ya no muestra cookies. Excelente investigación y ejemplo. –
Tal vez con la misma política de origen, no puede realizar una solicitud http a un dominio que no sea el mismo en el que se ejecuta el script; sin embargo, creo que podría pasar fácilmente las cookies redireccionando al usuario a una página mediante window.location y pasar toda la información a través de los parámetros de la cadena de consulta. –