usuarios usando sistema sesiones manejo ejemplos ejemplo control autenticación php session login cookies

sesiones - Sistema de inicio de sesión PHP usando cookies y hashes salados



sesiones en php (3)

Almacene el ID en $ _SESSION pero no almacene la contraseña hash o no. Una vez que el usuario ha iniciado sesión y la ID se guarda en $ _SESSION, ya no necesita la contraseña.

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 salado.

Puedo 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 cierre sesión permanentemente).

En el pasado, jugué con las variables $ _SESSION. Sin embargo, parece que se eliminan cuando el usuario abandona el navegador, lo cual no es deseado. Además, no puedo "asumir" que el usuario no intentará engañar al sistema, por lo que debe ser seguro.

Asi que aqui 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 debe almacenarse en la variable session / cookie?

Tenga en cuenta que no se están teniendo en cuenta los problemas de seguridad de la base de datos en esta pregunta en particular.

En cuanto al número 3, lo que quiero decir exactamente es:

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

Quiero mantener mi sitio web tan seguro pero eficiente y fácil de usar como sea posible. Si se toma 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. Trataré de seguir adelante e implementar para ver cuál fue más útil.


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

En cuanto 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 - efectivamente controla la duración de la sesión.

session.gc_probability y session.gc_divisor determinan conjuntamente con qué frecuencia se realizará la recolección de basura de la sesión.

Y por último, session.cookie_lifetime controla el tiempo de vida de la cookie de la sesión (la cookie que contiene la identificación de la sesión para que no tenga que ser tranmitida sobre la URL). Debe coincidir con el valor de la session.gc_maxlifetime.

Además, nunca almacene contraseñas en sesiones o cookies (incluso en formato hash). Solo los resultados de la autenticació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 datos de cookies.

En general, implementé la funcionalidad recordarme en aplicaciones web usando cookies. Un buen lugar para comenzar para obtener información sobre la creación de un sistema de inicio de sesión persistente "seguro" es esta publicación de blog en la pecera . Una respuesta en profundidad ya está cubierta 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 encriptadas.

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 de compras sin iniciar sesión, pero si desea pagar o editar su cuenta de alguna manera, debe ingresar su contraseña nuevamente.