2009-03-19 25 views
41

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 acerca de los ataques XSS como este:Cookies de inicio de sesión/sesión, Ajax y seguridad

How do HttpOnly cookies work with AJAX requests?

y

http://www.codinghorror.com/blog/archives/001167.html

tanto, 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) ¿Se 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 siguiente llamada al servidor sin tener que salir de la página.

Realmente quiero definir el consenso, la forma más segura de hacerlo. Con el tiempo, este código está previsto para ser realizado de código abierto, así que por favor sin código de comercio (o nada que no se ponían de pie al escrutinio público)

Gracias, -Todd

Respuesta

68
  1. necesidades que la cookie se generará 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. No sería realmente ú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 realizar el proceso de inicio de sesión de la misma forma en que podría haber confiado en una 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 lo hace, lo que se puede lograr usando la extensión de cookie "httponly" honrada por 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 la información en tránsito o hacerse pasar por el servidor, por lo que es muy útil para prevenir la transmisión del texto 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 un arreglo, todo si lo usa: todavía necesita estar atentos acerca de la creación de scripts entre sitios y la falsificación de solicitudes entre sitios.

  2. (ver 1. En cierto modo me las ha combinado)

  3. Teniendo en cuenta que la cookie se establece por el servidor en sus cabeceras de respuesta HTTP, sí es fiable. 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 necesita preocuparse por el soporte del navegador para AJAX).

  4. 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 se utiliza AJAX o no no afecta a la seguridad de todo lo que mucho ya que toda la seguridad real que sucede en el lado del servidor, y el servidor de una llamada AJAX es como un no Llamada AJAX: no es confiable. Por lo tanto, deberá tener en cuenta problemas tales como session fixation y login CSRF, así como los problemas que afecten a la sesión en su conjunto como CSRF y XSS tanto como lo haría si no estuviera utilizando 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

+6

Gracias, que la respuesta fue justo lo que estaba buscando - reflexivo y nada menos que impresionante. Lo aprecio. Todd – supertodda

Cuestiones relacionadas