2008-12-31 9 views
18

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.Sistema de inicio de sesión de PHP utilizando cookies y hastings salados

Puedo averiguar si un inicio de sesión es exitoso o no, pero ahora necesito almacenar esa información en alguna parte (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.

lo tanto, 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 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.

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

  • debo guardar el ID y la contraseña con algoritmo hash del usuario en la cookie/sesión, o
  • debo guardar el ID y la no -hizo una contraseña del usuario en la cookie/sesión, o
  • ¿Debo almacenar un "SessionID" y la contraseña (hash o no?) o
  • Debo almacenar un "SessionID", el "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

EDIT: parecen de respuestas de Brian combinados Eran ya 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.

+0

Debe volver a utilizar un marco de autenticación existente siempre que sea posible, porque es * complejo *. Por ejemplo, eche un vistazo a https://github.com/delight-im/PHP-Auth – caw

Respuesta

9

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, he implementado la funcionalidad Recordarme en aplicaciones web utilizando 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 este blog post on the fishbowl. Ya se cubre una respuesta detallada en another Stack Overflow answer.

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.

+1

Este artículo de seguimiento lleva eso al siguiente nivel: http://jaspan.com/improved_persistent_login_cookie_best_practice – jmucchiello

+0

@jmucchiello el esquema 'mejorado' desafortunadamente es discutible. Lea también: http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication/477579#477579 – Jacco

8

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 juntos determinan con qué frecuencia se realizará la recolección de basura de la sesión.

Y última sesión.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.

0

Almacene la 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.

Cuestiones relacionadas