¿Puedo generar un token CSRF de doble cookie en el cliente con JavaScript?

7

¿Hay algún problema con la creación del token CSRF con JavaScript justo antes de enviar el formulario? Ejemplo:

var csrf_token = Math.random();

// Write csrf token to cookie.

// Add csrf token to the form being submitted.

// Submit form.

// Verify cookie csrf to form csrf on the server.

// When request is done; remove the cookie.

// Rinse and repeat.

Entiendo que esto es vulnerable a XSS, pero XSS podría simplemente enviar el formulario con valores personalizados, por lo que es peor tener XSS.

    
pregunta unska 01.03.2017 - 10:04
fuente

1 respuesta

4

No recomendaría esto. Para que el token ofrezca alguna protección, debe ser impredecible. Math.random() no es criptográficamente seguro: no hay garantía de que un atacante no pueda generar cargas de valores aleatorios, detectar el patrón y luego deducir los valores anteriores, por lo que encuentra el valor del token secreto. Esto se llama "predicción cruzada Math.random() ", y puede leer más sobre esto aquí y aquí .

Creo (aunque no estoy seguro) que la mayoría de los navegadores modernos protegen contra esto en la práctica, pero ese es un detalle de implementación en el que no apostaría la seguridad de mi aplicación. En realidad, MDN advierte contra que:

  

Math.random() no proporciona números aleatorios criptográficamente seguros. No los uses para nada relacionado con la seguridad. Utilice la Web Crypto API en su lugar, y más precisamente el método window.crypto.getRandomValues() .

¿Puedes cambiar a getRandomValues() ? Solo si estás de acuerdo con compatibilidad con el 80% del navegador .

Antes de hacer esto, pregúntese por qué no puede simplemente generar el token en el servidor. Si opta por el enfoque del cliente de todos modos, al menos evite estos dos escollos:

  • ¡Asegúrese de que no se pasa ninguna ficha en el formulario ni ninguna en la cookie! Una comprobación de igualdad ingenua podría dejar pasar eso, ya que ambos son una cadena vacía, pero eso abriría una vulnerabilidad.
  • No debe haber una URL que cargue una página y envíe automáticamente un formulario, agregando el token en el proceso. Tal URL podría ser abusada.
respondido por el Anders 01.03.2017 - 11:00
fuente

Lea otras preguntas en las etiquetas