Actualmente estoy creando una aplicación de una sola página con una interfaz de JavaScript / HTML. El front-end realiza llamadas a una API WEB que fue escrita en .NET. Actualmente tengo una página HTML donde un usuario ingresa sus credenciales y hace clic en iniciar sesión. Luego, se envía una solicitud AJAX a la API WEB que autentica al usuario y devuelve una cookie solo de HTTP que contiene un token web de Json. El navegador luego envía esta cookie en cada solicitud posterior, y el controlador la valida.
Lo anterior funciona bien, sin embargo, carece de protección CSRF. Estoy tratando de descubrir la mejor manera de implementar esto. De mi investigación, parece que hay algunas opciones.
-
El artículo en enlace sugiere extraer un token de una cookie y luego enviarlo como un encabezado de solicitud. Para hacer esto, necesitaría quitar la marca HTTP-Only, para que JavaScript pueda acceder a la cookie. No creo que esta sea la mejor solución, ya que podría exponer la información de la sesión si se encuentra una vulnerabilidad XSS. ¿Hay algo que este olvidando?
-
En otro lugar, leí sobre el envío de una cookie separada que contenía el token CSRF y sacaba el valor con JavaScript. Luego, envíe ese valor como un encabezado personalizado en las solicitudes subsiguientes de AJAX y haga que la API WEB se valide basándose en ese encabezado. Escribí una aplicación de prueba de concepto rápida para esto y descubrí que el navegador aún enviará la cookie en la que se entregó el token CSRF en futuras solicitudes. ¿Esto plantea un problema? ¿Podría una página con un ataque CSRF explotar esto de alguna manera?
-
Similar a lo anterior, pero en lugar de entregar el token CSRF a través de una cookie, envíelo a través de un encabezado personalizado y haga que JavaScript lo lea desde allí. Esto parece que es el más sencillo, pero ¿ve algún inconveniente con este enfoque?
Además, ¿es seguro seguir usando un solo token CSRF para la sesión completa de un usuario, o debería actualizarse en cada solicitud?