Pregunta

Estoy desarrollando un sistema de inicio de sesión basado en PHP. Cada usuario tiene una ID (un número) y una contraseña, que se almacena como un hash con sal.

Soy capaz de averiguar si un inicio de sesión es exitoso o no, pero ahora necesito almacenar esa información en algún lugar (para que el usuario no esté desconectado permanentemente).

En el pasado, he jugado con las variables $ _SESSION. Sin embargo, estos parecen ser eliminados cuando el usuario abandona el navegador, lo cual no es deseado. Además, no puedo " asumir " que el usuario no intente engañar al sistema, por lo que tiene que ser seguro.

Entonces, aquí están mis preguntas:

  1. ¿Debo usar $ _SESSION o $ _COOKIE ? ¿Cuáles son las principales ventajas de cada uno de estos enfoques?
  2. ¿Cómo implementar una casilla de verificación 'Recordarme'?
  3. ¿Qué información se debe almacenar en la variable de sesión / cookie?

Tenga en cuenta que en esta pregunta en particular no se toman en cuenta los problemas de seguridad de la base de datos.

Con respecto al número 3, lo que quiero decir exactamente es:

  • ¿Debo almacenar el ID y la contraseña con hash del usuario en la cookie / sesión, o
  • ¿Debo almacenar el ID y la contraseña no hash del usuario en la cookie / sesión, o
  • ¿Debo almacenar un " SessionID " y la contraseña (con hash o sin hash?) o
  • ¿Debo almacenar un " SessionID " ;, el " ID " y la contraseña (una vez más, con hash o sin hash)?

Quiero que mi sitio web sea lo más seguro, eficiente y fácil de usar posible. Si se adopta un enfoque basado en SessionID, también agradecería alguna explicación sobre cómo almacenarlo en la base de datos.

Gracias de antemano

EDITAR: las respuestas combinadas de Eran y Brian parecen ser lo que necesito. Desafortunadamente, solo puedo marcar uno de ellos como aceptado. Intentaré seguir adelante e implementar para ver cuál fue más útil.

¿Fue útil?

Solución

Quiero reiterar el punto de Eran nunca almacenar la contraseña de los usuarios o incluso un hash de la contraseña en la sesión o en los datos de cookies.

En general, he implementado la funcionalidad Recordarme en aplicaciones web mediante cookies. Un buen punto de partida para obtener información sobre cómo crear un " seguro " el sistema de inicio de sesión persistente es este publicación de blog en la pecera . Una respuesta en profundidad ya se trata en otra respuesta de desbordamiento de pila .

Si necesita asegurarse de que el inicio de sesión sea seguro, debe usar https. Esto se debe a que las cookies o las sesiones pueden ser robadas si no están cifradas.

Otra buena práctica a seguir es el sistema de inicio de sesión de 2 niveles. Puede ver esto en sitios como Amazon, donde puede agregar cosas a su carrito sin iniciar sesión, pero si desea retirar o editar su cuenta de alguna manera, debe ingresar su contraseña nuevamente.

Otros consejos

Para información confidencial (es decir, resultados de autenticación) use solo sesiones. Las sesiones se almacenan en el servidor y es mucho menos probable que se vean comprometidas.

Con respecto a la duración de la sesión, el valor predeterminado es la duración de la sesión del navegador, pero puede controlarlo. Hay varias configuraciones que afectan eso:

session.gc_maxlifetime: controla de manera efectiva la duración de la sesión.

session.gc_probability y session.gc_divisor juntos determinan con qué frecuencia se llevará a cabo la recolección de basura de sesión.

Y last - session.cookie_lifetime controla la duración de la cookie de la sesión (la cookie que contiene el ID de la sesión para que no tenga que aparecer en la URL). Debe coincidir con el valor de session.gc_maxlifetime.

Además, nunca almacene contraseñas en sesiones o cookies (incluso en formato hash). Solo los resultados de la autenticación.

Almacene el ID en $ _SESSION pero no almacene la contraseña con hash o sin hash. Una vez que el usuario haya iniciado sesión y la ID se haya guardado en $ _SESSION, ya no necesitará la contraseña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top