security - ¿Cuál es la mejor manera de implementar “recordarme” para un sitio web?
cookies remember-me (4)
Mejores prácticas de cookies de inicio de sesión persistentes
Puede usar esta estrategia descrita aquí como la mejor práctica (2006) o una estrategia actualizada descrita aquí (2015):
- Cuando el usuario inicia sesión correctamente con Recordarme, se emite una cookie de inicio de sesión además de la cookie de administración de sesión estándar.
- La cookie de inicio de sesión contiene un identificador de serie y un token . La serie y el token son números aleatorios indiscutibles de un espacio adecuadamente grande. Ambos se almacenan juntos en una tabla de la base de datos, el token está hasheado (sha256 está bien).
- Cuando un usuario que no ha iniciado sesión visita el sitio y presenta una cookie de inicio de sesión, se busca el identificador de la serie en la base de datos .
- Si el identificador de la serie está presente y el hash del token coincide con el hash para ese identificador de la serie, el usuario se considera autenticado . Se genera un nuevo token, se almacena un nuevo hash para el token sobre el registro anterior y se emite una nueva cookie de inicio de sesión para el usuario (está bien reutilizar el identificador de la serie ).
- Si la serie está presente pero el token no coincide, se supone un robo . El usuario recibe una advertencia fuertemente redactada y todas las sesiones recordadas del usuario se eliminan.
- Si el nombre de usuario y la serie no están presentes, la cookie de inicio de sesión se ignora .
Este enfoque proporciona defensa en profundidad. Si alguien logra filtrar la tabla de la base de datos, no le da al atacante una puerta abierta para hacerse pasar por los usuarios.
Quiero que mi sitio web tenga una casilla de verificación en la que los usuarios puedan hacer clic para que no tengan que iniciar sesión cada vez que visiten mi sitio web. Sé que necesitaré almacenar una cookie en su computadora para implementar esto, pero ¿qué debería contener esa cookie?
Además, ¿hay errores comunes a los que hay que tener cuidado para evitar que esta cookie presente una vulnerabilidad de seguridad, que podría evitarse mientras se sigue dando la funcionalidad de "recordarme"?
Almacena su UserId y un RememberMeToken. Cuando inician sesión con Recordarme, se genera un nuevo RememberMeToken (que invalida cualquier otra máquina que esté marcada, recordarme).
Cuando regresen, búsquelos en el token Recordarme y asegúrese de que el ID de usuario coincida.
Investigando sesiones persistentes yo mismo he descubierto que simplemente no vale la pena el riesgo de seguridad. Úselo si es absolutamente necesario, pero debería considerar que una sesión de este tipo solo se autentica débilmente y obligue a un nuevo usuario a iniciar sesión para cualquier cosa que pueda ser valiosa para un atacante.
La razón, por supuesto, es que las cookies que contienen su sesión persistente son tan fácilmente robadas.
4 formas de robar sus cookies (de un comentario de Jens Roland en la página @splattne
basado en su respuesta):
- Al interceptarlo sobre una línea no segura (rastreo de paquetes / secuestro de sesión)
- Accediendo directamente al navegador del usuario (a través de malware o acceso físico a la caja)
- Leyéndolo desde la base de datos del servidor (probablemente Inyección SQL, pero podría ser cualquier cosa)
- Por un hack XSS (o un exploit similar del lado del cliente)
Yo almacenaría una identificación de usuario y un token. Cuando el usuario vuelva al sitio, compare esas dos piezas de información con algo persistente como una entrada de base de datos.
En cuanto a la seguridad, simplemente no ponga nada allí que le permita a alguien modificar la cookie para obtener beneficios adicionales. Por ejemplo, no almacene sus grupos de usuarios o su contraseña. Cualquier cosa que pueda modificarse y que pueda burlar su seguridad no debe almacenarse en la cookie.