2009-06-08 13 views
36

Actualmente estoy configurando un sistema de autenticación. Mi disposición actual es obtener su correo electrónico del $_POST, md5 su contraseña, y verificar la base de datos contra su correo electrónico y su contraseña. Si coincide, utilizo session_start, y comenzar a almacenar los datos en la variable $_SESSION, así:¿Manera correcta de administrar sesiones en PHP?

$_SESSION['uid'] = $uid; 
$_SESSION['first_name'] = $first_name; 

Y en todas las páginas del sitio web, me preformas una sencilla comprobación de

isset($_SESSION['uid']); 

si no, redirija a la página de índice, si es, cargue la página.

¿Estoy haciendo esto correctamente? ¿Esto es lo suficientemente seguro? ¿Qué tan fácil es para alguien forjar esa información?

Alguien me dijo que debería crear una tabla, con el correo electrónico del usuario y su identificación de sesión y usar eso para administrar las cosas ... Me he confundido bastante, ¿cómo podría ayudar esto?

¿Alguien podría aclarar esto? ¿Cuál es la forma correcta de administrar la autenticación con sesiones de PHP?

Gracias.

+1

Usted ya sabe cómo utilizar correctamente las sesiones. Sin embargo, lo que intentas construir es un sistema de * autenticación *. Esto es mucho más complejo. Puede echarle un vistazo a https://github.com/delight-im/PHP-Auth e inspeccionar su fuente para ver algo en lo que se haya puesto mucho esfuerzo y pensamiento. – caw

Respuesta

41

Actualización de seguridad: a partir del 10/23/2017: El asesoramiento en esta respuesta, mientras que de importancia histórica, es completamente inseguro Nunca se debe usar md5 al hacer hash con una contraseña porque es tan fácil de usar. Consulte this answer para saber cómo usar la contraseña integrada * api para verificar y verificar las contraseñas.


He tratado con los sistemas de entrada/autenticación anteriormente, y me encuentro con varias deficiencias de este método:

  • que "md5 su contraseña y comprobar la base de datos" - esto significa que si una persona tiene acceso a la base de datos, ¡puede descubrir quién tiene las mismas contraseñas!

ADENDA (19 Sep 2015) * Mira esta link. Explica todos los conceptos básicos, los enfoques que puede tomar, por qué debe tomar esos enfoques y también le da código PHP de muestra. Si es demasiado largo para leer, simplemente ve hasta el final, toma el código y prepárate.

acercamiento mejor: para almacenar MD5 de username+password+email+salt en la base de datos, la sal ser al azar, y se almacena junto con el registro del usuario.

  • usando el 'uid' directamente en las variables de sesión puede ser muy arriesgado. Considere esto: mi amigo ha iniciado sesión desde mi navegador, y se va por una fuga. Reviso rápidamente qué cookies están configuradas en su navegador y descifro su 'uid'. ¡Ahora lo tengo!

enfoque mejor: para generar un sessionid aleatorio cuando el usuario inicia sesión con éxito, y almacenar esa ID de sesión en la matriz $_SESSION[]. También necesitará asociar el sessionid con su uid (usando la base de datos o memcached). Las ventajas son:

  1. incluso puede enlazar un sessionid a una determinada IP, de manera que el sessionid no puede ser objeto de abuso, incluso si es capturado
  2. Usted puede invalidar un sessionid mayor si el usuario se conecta desde otra ubicación . Entonces, si mi amigo inicia sesión desde su propia computadora, el sessionid en mi computadora deja de ser válido automáticamente.

EDIT: Siempre he usado cookies manualmente para el manejo de mi sesión. Esto me ayuda a integrar los componentes de JavaScript de mis aplicaciones web más fácilmente. Es posible que necesite lo mismo en sus aplicaciones, en el futuro.

+0

¿cómo puedo generar una identificación de sesión aleatoria? con start_session? – daniel

+1

con la aplicación inteligente de la función aleatoria. Lo probé, y da muy buenos resultados ... compruébalo aquí: http://jrharshath.qupis.com/random/ – jrharshath

+1

Esto fue bueno en 2009, ahora usas bcrypt o algo así. –

26

No hay nada malo en hacer esto

isset($_SESSION['uid']); 

datos de la sesión no se transmite al usuario, se almacena en el servidor (o donde las manejador de sesiones de la guarda). Lo que se transmite al usuario es la identificación de la sesión, que es solo una cadena aleatoria generada por PHP, esto puede ser robado, por supuesto, porque se envía al usuario.

Se debe observar claramente que almacenar aleatoriamente una cadena en la base de datos y la sesión de los usuarios y luego usar eso para identificar al usuario no hace la sesión más segura, si el atacante obtiene la sesión todavía tendrán comprometido el usuario.

Lo que estamos discutiendo ahora es session hijacking, usted puede estar pensando que puede simplemente almacenar la dirección IP en la sesión y verificar que con la IP provenga de la solicitud y terminar con ella. Sin embargo, a menudo no es tan simple, me quemé con esto recientemente cuando en una gran aplicación web almacenamos un hash del agente de usuario + dirección IP en la sesión y luego comprobamos que coincidían en cada ocasión, para el 99% de los usuarios esto funcionó bien Sin embargo, comenzamos a recibir llamadas de personas que descubrían que continuamente se desconectaban sin explicación. Pusimos registro en las comprobaciones de secuestro de la sesión para ver qué estaba pasando y descubrimos que estas personas entrarían en una IP y su sesión continuaría en otra, esto no fue un intento de secuestro, sin embargo, tenía que ver con cómo su servidor proxy funcionó, como resultado modificamos nuestro código de secuestro de sesión para determinar el class of the IP address y desde allí averiguar la porción de red de la dirección IP y almacenar solo esas partes de la dirección IP, esto es un poco menos seguro en ese secuestro de sesión teóricamente podría venir de dentro de la misma red pero causó que todos nuestros falsos positivos desaparezcan.