2009-02-07 9 views
11

He estado interesado en cómo funcionan las sesiones internamente, pero tengo poco conocimiento de C (y no estoy seguro de dónde buscar en la fuente PHP para esto).¿Es correcto mi entendimiento de las sesiones de PHP?

Esto es lo que entiendo de sesiones en la actualidad

  1. Al iniciar una sesión al usuario se le asigna un identificador de sesión que se almacena en una cookie.
  2. Cuando se guardan los datos de la sesión (a través de $_SESSION) se almacenan en el sistema de archivos, con la id. De sesión correspondiente y un tiempo de caducidad.

¿Es esto correcto? Además, ¿cuál es el método en el que se crean las identificaciones de sesión? Supongo que se basa en el tiempo, pero ¿qué ocurre si dos usuarios envían una solicitud al mismo tiempo? ¿Qué métodos existen internamente para evitar que obtengan el mismo ID?

Gracias,

Respuesta

27

Mi entendimiento es del proceso de manejo de sesión interna es la siguiente:

Cuando session_start se llama, PHP está buscando a un parámetro desde el cliente que fue enviado a través de POST, GET, o en una cookie (según la configuración, vea session.use_cookies, session.use_only_cookies y session.use_trans_sid) con el nombre del valor de session.name para usar la ID de sesión de una sesión ya iniciada.

Si encuentra una ID de sesión válida, intenta recuperar los datos de la sesión del almacenamiento (consulte session.save_handler) para cargar los datos en $_SESSION. Si no puede encontrar una ID o su uso está prohibido, PHP genera una nueva ID usando una función hash (ver session.hash_function) en los datos de una fuente que genera datos aleatorios (ver session.entropy_file).

Al final del tiempo de ejecución o cuando se llama a session_write_close, los datos de la sesión en $_SESSION se guardan en el almacenamiento designado.

1

La ID de sesión probablemente sea solo una cadena aleatoria de letras y números. También sería extraño que PHP no verificara que es único y, por lo tanto, no puede ser igual para dos usuarios. En cuanto a (1) y (2), diría que estás en lo correcto, pero no he trabajado con PHP recientemente, así que no dudes en no creerme.

15

Mira php_session_create_id en ext/session/session.c en la fuente php

Dice así:

  • llegar la hora del día
  • obtener la dirección IP remota
  • construir una cadena con los segundos y microsegundos a partir de la hora actual, junto con la dirección IP
  • introduzca eso en session hash function configurado (ya sea MD5 o SHA1)
  • si está configurado, alimentación cierta aleatoriedad adicional de un entropy file
  • generar valor hash última

Por eso, conseguir un duplicado es bastante difícil.Sin embargo, debe familiarizarse con el concepto de fijación de sesión, que le permite a un atacante elegir potencialmente el session_id que adoptará su destino; consulte Sessions and Cookies para obtener una buena guía.

Cuestiones relacionadas