req - Cookies de inicio de sesión/sesión, Ajax y seguridad
node req session (1)
La cookie debe generarse en el lado del servidor porque la sesión vincula al cliente al servidor y, por lo tanto, el intercambio de tokens debe ir de un servidor a otro en algún momento. En realidad, no sería útil generar la cookie del lado del cliente, porque el cliente es la máquina remota que no es de confianza.
Es posible tener el conjunto de cookies durante una llamada AJAX. Para el servidor (y la red), una llamada AJAX es simplemente una llamada HTTP, y cualquier respuesta HTTP del servidor puede establecer una cookie. Entonces, sí, es posible iniciar una sesión en respuesta a una llamada AJAX, y el cliente almacenará la cookie normalmente.
Por lo tanto, puede usar AJAX para hacer el proceso de inicio de sesión de la misma manera que podría haber confiado en un POST desde un formulario en la página. El servidor los verá de la misma manera, y si el servidor establece una cookie, el navegador la almacenará.
Básicamente, el Javascript del lado del cliente nunca necesita saber el valor de la cookie (y es mejor para la seguridad si no es así, lo que se puede lograr utilizando la extensión de cookie "httponly" que honran los navegadores recientes). Tenga en cuenta que otras llamadas HTTP desde el cliente al servidor, ya sean solicitudes normales de página o solicitudes AJAX, incluirán esa cookie automáticamente, incluso si está marcada httponly y el navegador respeta esa extensión. Su script no necesita ser "consciente" de la cookie.
Usted mencionó el uso de HTTPS (HTTP sobre SSL), que impide que otros puedan leer información en tránsito o hacerse pasar por el servidor, por lo que es muy útil para evitar la transmisión de texto sin formato de la contraseña u otra información importante. También puede ayudar a protegerse de los ataques basados en la red, aunque no lo hace inmune a todo lo que CSRF puede arrojarle, y no lo protege en absoluto contra ataques como la fijación de sesión o XSS. Por lo tanto, evitaría pensar en HTTPS como una solución para todo si la usa: igual debe vigilar las secuencias de comandos entre sitios y la falsificación de solicitudes entre sitios.
(ver 1. En cierto modo los combiné)
Dado que el servidor establece la cookie en sus encabezados de respuesta HTTP, sí es confiable. Sin embargo, para que sea compatible con varios navegadores, debe asegurarse de que el inicio de sesión sea posible cuando AJAX no esté disponible. Esto puede requerir la implementación de una alternativa que solo se ve cuando no hay Javascript o si AJAX no está disponible. ( Nota: ahora en 2014, ya no tiene que preocuparse por el soporte del navegador para AJAX ).
No cambiaría la seguridad. No sería necesario, excepto que he visto iframes ocultos antes para ''simular'' AJAX antes, es decir, realizar llamadas asincrónicas al servidor. Básicamente, como sea que lo haga, no importa, es el servidor que configura la cookie, y el cliente aceptará y devolverá la cookie, ya sea que lo haga por AJAX o no.
En su mayor parte, si usa AJAX o no no afecta la seguridad tanto como toda la seguridad real ocurre en el lado del servidor, y para el servidor una llamada AJAX es como una llamada no AJAX: no es de confianza . Por lo tanto, deberá tener en cuenta problemas como la fijación de sesión y el CSRF de inicio de sesión , así como los problemas que afecten a la sesión en su conjunto, como CSRF y XSS , tanto como lo haría si no utilizara AJAX. Los problemas no cambian cuando se usa AJAX, excepto, supongo, que puede cometer más errores con una tecnología si está menos familiarizado con ella o si es más complicado.
Respuesta actualizada en septiembre de 2014
Estoy tratando de determinar el método más seguro para un formulario de inicio de sesión basado en Ajax para autenticar y establecer una cookie del lado del cliente. He visto cosas sobre ataques XSS como este:
¿Cómo funcionan las cookies de HttpOnly con las solicitudes de AJAX?
y
http://www.codinghorror.com/blog/archives/001167.html
Entonces, supongo que mis preguntas centrales son ...
1) ¿Está utilizando ajax puro para establecer cookies seguras? En caso afirmativo, ¿cuál es el método más seguro (httpOnly + SSL + valores encriptados, etc.)?
2) ¿Un método de Ajax puro implica establecer el lado del cliente de cookies? ¿Es esto seguro?
3) ¿Está estableciendo cookies de esta manera confiable en todos los principales navegadores / sistemas operativos?
4) ¿Sería más seguro usar un IFrame oculto (llamando a una página web para establecer las cookies)?
5) Si es posible, ¿alguien tiene código para esto (PHP es mi backend)?
Mi objetivo es establecer las cookies y tenerlas disponibles para la próxima llamada al servidor sin tener que salir de la página.
Realmente quiero definir el consenso, la manera más segura de hacer esto. Eventualmente, se planea que este código sea de código abierto, así que por favor no código comercial (o nada que no resista el escrutinio público)
Gracias, -Todd