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:
- 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.
- 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!
- 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ó.
- Establezca el token en una cookie en el lado del usuario.
- 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.
- 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.
Use las sesiones y aumente el tiempo de caducidad de la sesión. – Dhruvisha
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