2012-07-18 21 views
5

Hay muchas instancias en mi código donde se necesita acceso rápido al nombre de usuario y ID de usuario conectados. Actualmente uso cookies. Esto no es seguro.¿Dónde guardo el nombre de usuario y el ID de usuario? sesiones o cookie?

Pensé que las sesiones serían una solución, pero las sesiones caducan.

Otra opción es almacenar un token único en una cookie y luego hacer coincidir con un token almacenado en la base de datos, para recuperar los datos de usuario registrados. Esta es la solución más segura, pero el problema que veo con esto es que hay muchas veces en mi código donde se necesita el nombre de usuario y el ID de usuario registrados, pero consultar todo el tiempo consume recursos innecesarios (¿es esto cierto?)

¿Cuál es la solución?

+3

Use las sesiones y aumente el tiempo de caducidad de la sesión. – Dhruvisha

+2

Le recomiendo que lea [La guía definitiva para la autenticación del sitio web basado en formularios] (http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication). – Polynomial

Respuesta

3

Si no es necesario en el cliente, asegúrese de que no termine allí.

Dado que los UserId son específicos de un usuario que ha iniciado sesión y no de un equipo específico, una cookie no parece ser el camino a seguir.

La autenticación básica en PHP generalmente se realiza con sesiones, por lo que podría agregar el userId a la sesión.

Si los tiempos de sesión son demasiado cortos, aumente el tiempo de la sesión.

+1

Ok gracias, últimas preguntas. ¿Cuál es el tiempo máximo de sesión que puedo asignar? No quiero que el usuario siga teniendo que renunciar. También, ¿qué sucede si la sesión expira (incluso con un aumento en el tiempo de la sesión)? ¿Debo hacerlo si la sesión expira y luego obtengo el nombre de usuario/ID de usuario de la base de datos y configuro la sesión nuevamente? – user892134

+1

Si no desea que el usuario tenga que seguir iniciando sesión, use un sistema de siempre recordar basado en tokens de un solo uso. Mantenga el tiempo de espera de la sesión relativamente corto, entre 10 y 60 minutos, según sus requisitos de seguridad. Ver * "PARTE II: Cómo permanecer conectado - La infame casilla de verificación" Recordarme "* de [La guía definitiva para la autenticación de sitios web basada en formularios] (http://stackoverflow.com/questions/549/the-definitive- guía-a-formularios-basada-web-autenticación) para obtener detalles sobre cómo manejar de forma segura tal característica. – Polynomial

+0

Si está permitido, puede sobreescribir la configuración predeterminada de php con la siguiente línea: 'ini_set ('session.gc_maxlifetime', '28800'); // establece el tiempo de la sesión en 4 horas' o simplemente edita el archivo php.ini (donde realmente debería hacerse). Si la sesión caduca, devuelva al usuario a la pantalla de inicio de sesión. –

-4

Guardo dicha información en una base de datos y al inicio creo un objeto de usuario en mi registro de objetos global. El objeto de usuario contiene información como nombre de usuario o correo electrónico y permite cambios de esas informaciones. El estado de inicio de sesión se almacena en la sesión y también en una cookie.

+3

Esta es una muy mala idea desde el punto de vista de la seguridad. – Polynomial

+0

@Polynomial ¿Qué es inseguro y cómo? ¿Almacenar información en una base de datos o usar cookies para identificar a un usuario? ¿De qué otra forma reconocerías a un usuario cuando regrese a tu sitio? – feeela

+0

Al hacer que inicien sesión de nuevo. Mantener cualquier tipo de identificador de sesión al lado del cliente es un riesgo de seguridad. Tales cookies podrían teóricamente ser robadas y utilizadas para secuestrar la sesión de alguien –

4

Voy a tratar de unir todo lo que se ha dicho en los comentarios en una sola respuesta. Como tal, por favor muéstrales a otros usuarios útiles algo de amor al subir la votación de sus respuestas/comentarios. También daré una breve descripción de cómo funcionan las sesiones, para que la respuesta sea útil para un público más amplio.

Cuando un usuario inicia sesión en un sitio web, se crea una sesión para identificarlos. Las sesiones se manejan en PHP creando una ID de sesión, luego asociando esa ID con una tienda de variables en el lado del servidor, a la que se accede en scripts PHP usando el superglobal $_SESSION. La ID de la sesión se almacena en una cookie en el lado del cliente e identifica su sesión.

Para permanecer seguro, la identificación de sesión debe ser única, aleatoria y secreta. Si un atacante adivina su ID de sesión, puede crear una cookie en su propia computadora usando esa misma ID, y hacerse cargo de su sesión. ¡Iniciarían sesión como tú! Esto obviamente es malo, así que PHP usa un fuerte generador de números aleatorios para crear esas ID de sesión. Para hacer las cosas más seguras, puede habilitar SSL en todo el sitio e informar al navegador que solo envíe la cookie a través de SSL, utilizando el indicador de solo HTTPS. Sin embargo, esto podría ser excesivo para su sitio.

Para evitar que las identificaciones de sesión filtradas sean útiles para siempre, o los tipos malos que se cuelan en su habitación después de haber salido a la tienda, las sesiones usan tiempos de espera. Lo mejor es que caduque después de un tiempo razonablemente corto, entre 10 y 60 minutos, dependiendo de sus requisitos de seguridad. Puede restablecer el tiempo de espera cada vez que vea la página, de modo que un usuario activo no se desconecte.

Para permitir que el usuario sea recordado (es decir, la casilla "recordarme"), debe proporcionar una cookie que funcione como un token de autenticación. Tenga en cuenta que este token es, para todos los efectos, lo mismo que tener su contraseña. Esto significa que si el malo se roba la cookie, puede iniciar sesión en su cuenta. Para que esta opción sea segura, podemos usar un token de un solo uso. Estos tokens deben ser de un solo uso, aleatorios, largos y secretos.¡Trátelos como si fueran contraseñas!

Aquí es cómo ponerlas en práctica:

  1. generar un token aleatorio. Use /dev/urandom si puede, de lo contrario necesitará varios cientos de valores de mt_rand para obtener algo "aleatorio" lo suficiente, luego restamé la cadena resultante con SHA1 para producir el token.
  2. Utilice un algoritmo de hashing de contraseña segura (por ejemplo, PBKDF2 o bcrypt) para crear un hash del token. No use SHA1 o MD5 para este fin, ¡NO están diseñados para contraseñas hash!
  3. Inserte el hash en una tabla de base de datos, junto con el ID del usuario al que pertenece y la fecha en que se creó.
  4. Establezca el token en una cookie en el lado del usuario.
  5. Cuando el usuario visita el sitio, no inicia sesión y se detecta una cookie de token de inicio de sesión, usa el mismo algoritmo que utilizó en el paso 2 para buscar el valor del token y lo busca en la base de datos. Si coincide con una entrada, ingrese al usuario como esa ID.
  6. Elimine la entrada de la base de datos y emita una nueva (vuelva al paso 1).

También debe ejecutar un script que busque tokens de sesión muy antiguos (por ejemplo, 3 meses o más) y eliminarlos. Esto requerirá que el usuario vuelva a iniciar sesión cuando vuelva después de un largo período de inactividad.

Para obtener una explicación más detallada de esto, y muchos datos más importantes sobre sistemas de inicio de sesión de formularios web seguros, lea The Definitive Guide to Forms-Based Website Authentication y consulte el OWASP project.

Cuestiones relacionadas