¿Cuál es la mejor manera de implementar & # 8220; recuérdame & # 8221; para un sitio web? [cerrado]

StackOverflow https://stackoverflow.com/questions/244882

  •  05-07-2019
  •  | 
  •  

Pregunta

Deseo 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 tener en cuenta para evitar que esta cookie presente una vulnerabilidad de seguridad, que podría evitarse mientras se brinda la funcionalidad 'recordarme'?

¿Fue útil?

Solución

Mejores prácticas de cookies de inicio de sesión persistentes mejoradas

Puede utilizar esta estrategia descrita aquí como la mejor práctica (2006) o una estrategia actualizada descrita aquí (2015):

  1. Cuando el usuario inicia sesión correctamente con Remember Me marcado, se emite una cookie de inicio de sesión además de la cookie estándar de administración de sesión.
  2. 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á en hash (sha256 está bien).
  3. Cuando un usuario que no ha iniciado sesión visita el sitio y presenta una cookie de inicio de sesión, el identificador de serie se busca en la base de datos .
    1. Si el identificador de serie está presente y el hash del token coincide con el hash de ese identificador de 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 serie ).
    2. Si la serie está presente pero el token no coincide, se supone un robo . El usuario recibe una advertencia fuertemente redactada y se eliminan todas las sesiones recordadas del usuario.
    3. 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.

Otros consejos

Almacenaría un ID de usuario y un token. Cuando el usuario regrese al sitio, compare esos dos datos con algo persistente como una entrada de la base de datos.

En cuanto a la seguridad, simplemente no coloque nada que permita que alguien modifique la cookie para obtener beneficios adicionales. Por ejemplo, no almacene sus grupos de usuarios o su contraseña. Cualquier cosa que pueda modificarse que eluda su seguridad no debe almacenarse en la cookie.

Almacena su ID de usuario y un RememberMeToken. Cuando inicien sesión con recordarme marcado, generar un nuevo RememberMeToken (que invalida cualquier otra máquina que esté marcada como recordarme).

Cuando regresen, búsquelos con el token recordarme y asegúrese de que el ID de usuario coincida.

Investigando sesiones persistentes, descubrí 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 autentique débilmente y obligue a un nuevo usuario a iniciar sesión para cualquier cosa que pueda ser valiosa para un atacante.

El motivo es, por supuesto, 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 < el código> @splattne basó su respuesta en):

  1. Al interceptarlo en una línea no segura (rastreo de paquetes / secuestro de sesión)
  2. Accediendo directamente al navegador del usuario (a través de malware o acceso físico a la caja)
  3. Al leerlo desde la base de datos del servidor (probablemente inyección de SQL, pero podría ser cualquier cosa)
  4. Por un hack XSS (o un exploit similar del lado del cliente)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top