¿Es segura la siguiente forma de implementar los tokens csrf?

0

Estoy usando una aplicación java / scala para escribir un servidor web (con fines de aprendizaje, por lo que no se permiten marcos). Pensé en la siguiente manera de implementar tokens csrf, pero no estoy seguro de si es seguro:

1 en cada página html incluye el script "csrfToken.js" que contiene el token (var csrkToken="example") 2 cuando se solicita este archivo, el token csrf se registra en el servidor (junto con el ID de usuario para hacer que el token sea utilizable únicamente por ese usuario en particular). 3 al enviar una publicación, poner, eliminar, etc., el cliente lee el token del archivo js y lo agrega a la solicitud 4 cuando una solicitud de publicación, colocación, eliminación, etc. llega al servidor, se comprueba el token 5 si la solicitud es exitosa, el token se elimina y el sitio se actualiza (para obtener un nuevo token) 6 si el sitio no recibe una notificación, el token no se elimina y se puede reutilizar

Nota: los tokens tienen una vida útil máxima (digamos 30 min). Si el sitio permanece abierto por más tiempo (digamos, exploración de varias pestañas), se notifica al uso que debe actualizar el sitio antes de continuar

Los principales problemas aquí son:

  1. El token se puede generar a través de solicitudes de obtención (esto es una violación de cómo deberían funcionar las solicitudes de obtención, pero no debería ser un problema de seguridad porque la misma política de origen impide que un atacante lea la respuesta a una solicitud en varios sitios)
  2. No estoy seguro de si un atacante o no un atacante podría leer el token csrf de los usuarios en un sitio maléfico y luego usarlo (suponiendo que mi sitio es xss seguro)
  3. No sé si mi token csrf que tiene una vida útil corta en realidad proporciona alguna seguridad adicional o simplemente disminuye la experiencia del usuario (considere que el token es lo suficientemente largo como para que un ataque de fuerza bruta no sea una preocupación)
  4. Editar: un script csrf podría generar un montón de capturas para crear muchos tokens csrf para el mismo usuario. Es por eso que deseo limitar el número máximo de tokens csrf que un usuario puede tener en un momento dado (digamos que 25 debería ser suficiente para cualquier usuario dado, pero no sé si este número es apropiado o no)

Si alguien pudiera decirme si mi implementación es segura y / o cómo mejorarla, se lo agradecería enormemente.

    
pregunta user2887596 13.06.2017 - 12:19
fuente

1 respuesta

1
  

"csrfToken.js" que contiene el token ( var csrkToken="example" )

Esto también se puede leer desde otros sitios, como este:

<script src="http://yoursite.com/csrfToken.js"></script><script>alert(csrfToken);</script>

Lapolíticadelmismoorigennoprotegecontraesto.

EstoesposibleporqueelarchivoesunapiezadeJavaScriptqueseasignaaunavariable,yestosepuedeleerconunaetiquetadescript.Porelcontrario,sielarchivoesunarchivodetextooJSON,nosepuedeleerdeorigencruzado

{"csrfToken": "example"}

Lo leerías tú mismo usando una solicitud ajax, pero otros sitios no pueden hacer esto.

    
respondido por el Sjoerd 13.06.2017 - 14:57
fuente

Lea otras preguntas en las etiquetas