pasar - sesiones php login
Qué tan único es el id de la sesión php (7)
No es muy único como enviado. En la configuración predeterminada es el resultado de un hash de varias cosas, incluido el resultado de gettimeofday (que no es terriblemente único), pero si está preocupado, debe configurarlo para extraer algo de entropía de / dev / urandom, como tal
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
busque "php_session_create_id" en el código del algoritmo real que están utilizando.
Editado para agregar: Hay un generador de números aleatorios DFA sembrado por el pid, mezclado con el tiempo en usecs. No es una condición de exclusividad firme, especialmente desde una perspectiva de seguridad . Usa la configuración de entropía arriba.
Actualizar:
A partir de PHP 5.4.0 session.entropy_file se establece de manera predeterminada en / dev / urandom o / dev / arandom si está disponible. En PHP 5.3.0 esta directiva se deja vacía por defecto. PHP Manual
¿Qué tan único es el id de sesión de php? Tengo la impresión de varias cosas que he leído que no debería confiar en que dos usuarios nunca obtengan el mismo sessionid. ¿No es un GUID?
No he encontrado una confirmación al respecto, pero creo que php comprueba si ya existe una ID de sesión antes de crear una con esa identificación.
El problema del secuestro de la sesión que preocupa a las personas es cuando alguien descubre la identificación de la sesión de un usuario activo. Esto se puede evitar de muchas maneras, para obtener más información, puede ver esta página en php.net y este documento sobre la fijación de sesiones.
No, la identificación de la sesión no es un GUID, pero dos usuarios no deberían obtener la misma ID de sesión ya que están almacenados en el servidor.
Puede instalar una función alternativa de generación de hash si desea personalizar la forma en que se genera la ID (es un número de 128 bits generado a través de MD5 por defecto). Ver http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
Para obtener más información sobre las sesiones de PHP, pruebe este excelente artículo http://shiflett.org/articles/the-truth-about-sessions que también contiene enlaces a otros artículos sobre la fijación de sesión y el secuestro.
Session_id puede ser duplicado, pero la probabilidad es muy baja. Si tiene un sitio web con un tráfico justo, puede ocurrir una vez en la vida de su sitio web, y solo molestará a un usuario por una sesión.
No vale la pena preocuparse por esto a menos que espere construir un sitio web de mucho tráfico o un servicio para la industria bancaria.
Si desea saber cómo PHP genera una ID de sesión por defecto, revise el código fuente en Github . Ciertamente no es aleatorio y se basa en un hash (predeterminado: md5) de estos ingredientes (ver la línea 310 del fragmento de código):
- Dirección IP del cliente
- Tiempo actual
- Generador de congruencia lineal PHP - un generador de números pseudoaleatorios (PRNG)
- Fuente aleatoria específica del sistema operativo: si el sistema operativo tiene una fuente aleatoria disponible (p. Ej., / Dev / urandom)
Si el sistema operativo tiene una fuente aleatoria disponible, entonces la fortaleza de la ID generada con el propósito de ser una ID de sesión es alta ( / dev / urandom y otras fuentes aleatorias de SO son (normalmente) PRNG criptográficamente seguros ). Sin embargo, si no lo hace, entonces es satisfactorio.
El objetivo con la generación de identificación de sesión es:
- minimizar la probabilidad de generar dos ID de sesión con el mismo valor
- hace que sea muy difícil computacionalmente generar claves aleatorias y golpear una en uso .
Esto se logra mediante el enfoque de PHP para la generación de sesiones.
No se puede garantizar absolutamente la unicidad , pero las probabilidades son tan bajas de alcanzar el mismo hash dos veces que, en términos generales, no vale la pena preocuparse.
Tamaño de session_id
Suponga que seesion_id está distribuido uniformemente y tiene un tamaño = 128 bits. Supongamos que cada persona en el planeta inicia sesión una vez al día con una nueva sesión persistente durante 1000 años.
num_sesion_ids = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46)
≈ 1/2**46
Entonces, la probabilidad de una o más colisiones es menos de una en 70 mil millones. Por lo tanto, el tamaño de 128 bits de session_id debería ser lo suficientemente grande. Como se mencionó en otros comentarios, session_manager también podría verificar que new session_id no exista.
Aleatoriedad
Por lo tanto, la gran pregunta que creo es si los session_id: s se generan con buena pseudo aleatoriedad. De eso nunca se puede estar seguro, pero recomendaría usar una solución estándar bien conocida y frecuentemente utilizada para este propósito (como probablemente ya lo haga).
Incluso si se evitan las colisiones debido a la comprobación, la aleatoriedad y el tamaño de session_id son importantes, de modo que los hackers no pueden, de alguna manera, hacer conjeturas calificadas y encontrar session_id: s activos con gran probabilidad.