He tenido esta funcionalidad (protección csrf) desde hace bastante tiempo. Lo que nunca me gustó de esto es que guardó los tokens csrf en el archivo de sesión. Si bien puede que no sea un problema real, lo veo como un problema, ya que eventualmente los tokens pueden acumularse, así que necesito utilizar un mecanismo de Gc y hacer un seguimiento de lo que se emitió cuando todo parece demasiado para mí.
Así que pasé los últimos días trabajando para mejorar esta "imperfección" y esto es lo que he encontrado. No publicaré ningún código real, solo explicaré la idea.
Cuando se emite un formulario, de forma predeterminada se genera un token. El token consta de algunos datos únicos para el usuario, como el ID de sesión o el ID de usuario, combinados con la cadena de fecha y hora actual en el formato YmdHi
. Todo esto se cifra mediante password_hash
y he pensado en ofuscar el hash mediante el intercambio de partes del mismo, pero aún no lo he hecho.
La validación fue un poco complicada y resultó ser una gran decepción. Para validar un token, creo un bucle que contiene la misma información sobre el usuario con la fecha y resta 1 minuto en cada iteración. El número de iteraciones es igual a la cantidad de minutos durante los cuales el token es válido, que no está almacenado en el token, por lo tanto, todos los tokens deben ser válidos durante el mismo periodo de tiempo, lo que no me parece una desventaja todavía. / p>
Quiero preguntarle si ve algún posible fallo o vulnerabilidad con este concepto.
El único problema posible que veo es que el servidor no guarda los tokens, por lo que, en teoría, cualquiera puede armar un token válido. Sin embargo, creo que es muy improbable que alguien pase días recolectando tokens y tenga un superordenador. en su sótano para ejecutar analistas estadísticos, lo que de nuevo no es garantía de que puedan descifrar el cifrado.
De todos modos, supongo que debería dejar de exponer mi incompetencia y dejar que la gente inteligente decida qué pasa.