Tenemos el siguiente caso de uso:
Los usuarios pueden registrarse automáticamente para una cuenta comercial al completar un formulario de validación con su ID, nombre, apellido y fecha de nacimiento. La identificación es algo que solo el usuario sabe de antemano. Los usuarios tienen 5 intentos para hacer coincidir toda su información.
Estamos planeando mantener un par de tablas en una base de datos en la que almacenamos los intentos de validación:
Table 1 columns: id, attempts
Table 2 columns: id, fname, lname, dob
Las tablas 1 y 2 tienen una relación de muchos. Este es un ejemplo de lo que sucede si el usuario intenta adivinar el nombre, el apellido y el DOB 5 veces antes de que esté bloqueado. La aplicación comprueba la columna de intentos de la tabla 1 y si es 5 o más de 5 para una ID específica, la cuenta de usuario (con esa ID específica) se trata como bloqueada.
table 1
id attempts
1234 5
table 2
id fname lname dob
1234 john doe 19900101
1234 jane doe 19900101
1234 jason doe 19900101
1234 john dae 20010102
1234 roger smith 19960101
El problema con el enfoque anterior es que solo estamos rastreando los intentos fallidos por ID. ¿Qué pasa si el usuario intenta cambiar la ID y atacar? ¿Manteniendo el primer nombre, apellido y fecha de nacimiento y adivinando el ID?
¿Quizás necesito repensar el diseño de la tabla de validación y mi enfoque para resolver el problema de que el usuario intente adivinar la identificación? ¿O hay una mejor manera de pensar en este problema?