Supongamos que queremos que los nuevos usuarios confirmen su dirección de correo electrónico en un sitio web seguro (uno en el que no queremos que los usuarios que hacen cuentas falsas se hagan pasar por otros usuarios). Por razones de UX podemos querer:
- Códigos más cortos posibles en caso de que el usuario los escriba
- códigos alfanuméricos para escribir fácilmente
- No requiere que el usuario vuelva a ingresar su dirección de correo electrónico cuando confirme el código
Un código que es demasiado corto es vulnerable a los intentos de fuerza bruta para confirmarlo. Por ejemplo, el código 1234 podría ser adivinado fácilmente. El atacante solo registra [email protected] y luego envía códigos de verificación de spam hasta que alcanza el objetivo (y puede verificar muchos otros correos electrónicos aleatorios).
Hay una serie de estrategias para luchar contra esto, incluyendo:
- Use un código largo que no se pueda adivinar, tal vez obligando al usuario a hacer clic en un enlace de verificación en lugar de escribirlo manualmente
- Caduca el código con relativa rapidez, lo que le da al atacante menos tiempo
- Obligue al usuario a identificar quién dice ser al iniciar sesión o al escribir su correo electrónico antes del código de confirmación. Luego expira el código después de X intentos. Esto obliga al atacante a tener que reiniciar constantemente sus adivinanzas, eliminando la posibilidad de una búsqueda exhaustiva. Sin embargo, es potencialmente un papercut UX. Tal vez un usuario haga clic en el correo electrónico de confirmación en un teléfono después de iniciar sesión en su escritorio. El teléfono requeriría iniciar sesión y es una ligera barrera para registrarse.
- Utilice capcha, limitación de velocidad u otras estrategias para impedir la automatización. Es probable que esto no garantice resolver el problema solo.
Sin embargo, cada estrategia puede potencialmente dañar la UX. ¿Qué es un equilibrio razonable de UX sin comprometer la seguridad?