Autenticación y sesiones
Cómo los usuarios demuestran quiénes son y cómo mantienes sus sesiones iniciadas sin entregar a un atacante las llaves. Es la superficie más atacada de cualquier aplicación.
Lista de verificación
- Aplica hash a las contraseñas con un algoritmo lento y con sal. Usa bcrypt, scrypt o Argon2, nunca SHA ni MD5 simples, y nunca guardes texto plano. Si puedes leer la contraseña de un usuario, también puede hacerlo un atacante con tu base de datos.
- Limita los intentos de inicio de sesión y de restablecimiento. Restringe los intentos por IP y por cuenta (por ejemplo, diez cada quince minutos) y luego devuelve 429. Sin esto, la fuerza bruta es trivial.
- No reveles qué correos existen. El inicio de sesión, el registro y el restablecimiento de contraseña deben devolver la misma respuesta genérica exista o no la cuenta, con tiempos y códigos de estado consistentes.
- Haz que los tokens de restablecimiento y verificación sean de vida corta y de un solo uso. Una hora o menos, invalidados al usarse. Trátalos como contraseñas.
- Vincula el flujo OAuth al navegador que lo inició. Si inicias sesión con Google, GitHub o similar, guarda un valor
stateen una cookie en la solicitud inicial y compáralo en el callback. Sin este vínculo, un atacante puede enviar a la víctima un enlace que la conecta a la cuenta del atacante (login-CSRF). Consulta APIs y solicitudes. - Valida la respuesta del proveedor de identidad. Exige un correo verificado, comprueba la audiencia y el emisor del token, y nunca confíes en un id que envíe el cliente.
- Si ofreces autenticación multifactor, condiciona el segundo paso al primero. El segundo factor solo debe ser accesible después de superar la verificación de contraseña, con un desafío de un solo uso; de lo contrario, el espacio de códigos se puede atacar por fuerza bruta por sí solo.
- Haz que las sesiones expiren y admite la revocación. Define una vida útil razonable para el token, y haz que un cambio de contraseña invalide todas las sesiones existentes.
- Comprueba la contraseña contra una lista de contraseñas filtradas (por ejemplo, la API de k-anonymity de HIBP) en el registro y al restablecerla.
Cómo probar
- Envía cincuenta inicios de sesión incorrectos con un script y confirma que se aplica la limitación.
- Compara la respuesta de restablecimiento para un correo real frente a uno falso. Deben ser idénticas.
- Inicia un inicio de sesión OAuth en un navegador y complétalo en otro. Debe fallar.