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.