Pregunta

¿Qué tan único es el ID de sesión de php? Me dieron la impresión de varias cosas que he leído que no debería confiar en que dos usuarios nunca obtengan la misma ID de sesión. ¿No es un GUID?

¿Fue útil?

Solución

Session_id puede duplicarse, pero la probabilidad es muy baja. Si tiene un sitio web con un tráfico justo, puede suceder 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 crear un sitio web de muy alto tráfico o un servicio para la industria bancaria.

Otros consejos

No es muy único como se envió. 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ás preocupado, debes configurarlo para obtener algo de entropía de / dev / urandom, como

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

buscar " php_session_create_id " en the code para el algoritmo actual están usando.

Editado para agregar: Hay un generador de números aleatorios de DFA sembrado por el pid, mezclado con el tiempo en usecs. No es una condición de unicidad firme especialmente desde una perspectiva de seguridad . Usa la configuración de entropía de arriba.

Actualización:

  

A partir de PHP 5.4.0 session.entropy_file por defecto es / dev / urandom o   / dev / arandom si está disponible. En PHP 5.3.0 se deja esta directiva.   vacío por defecto Manual de PHP

Si desea saber cómo PHP genera una ID de sesión, verifique el código fuente en Github . Ciertamente no es aleatorio y se basa en un hash (predeterminado: md5) de estos ingredientes (vea la línea 310 del fragmento de código):

  1. Dirección IP del cliente
  2. Hora actual
  3. PHP Linear Congruence Generator - un generador de números pseudoaleatorios (PRNG)
  4. Fuente aleatoria específica del SO : si el SO tiene una fuente aleatoria disponible (por ejemplo, / dev / urandom)

Si el sistema operativo tiene una fuente aleatoria disponible, entonces la intensidad de la ID generada con el fin de ser una ID de sesión es alta ( / dev / urandom y otras fuentes aleatorias del sistema operativo son (por lo general) PRNGs criptográficamente seguros ). Sin embargo, si no es así, es satisfactorio.

El objetivo con la generación de identificación de sesión es:

  1. minimice la probabilidad de generar dos ID de sesión con el mismo valor
  2. es 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 puedes garantizar absolutamente la singularidad , pero las probabilidades son tan bajas de tener el mismo hash dos veces de lo que es, en general, no vale la pena preocuparse.

Puede instalar una función de generación de hash alternativa si desea personalizar la forma en que se genera la ID (es un número de 128 bits generado a través de MD5 de forma predeterminada). Consulte http://www.php.net/ manual / es / 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-session que también enlaza con otros artículos sobre la fijación de sesiones y el secuestro.

Tamaño de session_id
Supongamos que seesion_id se distribuye uniformemente y tiene un tamaño = 128 bits. Suponga que cada persona en el planeta inicia sesión una vez al día con una sesión nueva y 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 

Por lo tanto, la probabilidad de que una o más colisiones sea menor a una en 70 mil billones. Por lo tanto, un tamaño de 128 bits del session_id debería ser lo suficientemente grande. Como se mencionó en otros comentarios, el session_manager también puede verificar que el nuevo session_id no existe ya.

Aleatoriedad
Por lo tanto, la gran pregunta que creo es si los session_id: s se generan con una buena pseudo aleatoriedad. En eso nunca se puede estar seguro, pero recomendaría el uso de una solución estándar bien conocida y de uso frecuente para este fin (como probablemente ya lo haga).

Incluso si se evitan las colisiones debido a la verificación, la aleatoriedad y el tamaño de session_id es importante, por lo que los piratas informáticos no pueden, de alguna manera hacer adivinaciones calificadas y encontrar session_id activo: s con gran probabilidad.

No he encontrado una confirmación de esto, pero creo que PHP comprueba si ya existe un ID de sesión antes de crear uno con ese ID.

El problema de secuestro de sesión que preocupa a la gente es cuando alguien descubre el ID de sesión de un usuario activo. Esto se puede evitar de muchas maneras, para obtener más información sobre eso, puede ver esta página en php.net y este documento sobre la fijación de la sesión

No, el ID de sesión no es un GUID, pero dos usuarios no deben obtener el mismo ID de sesión que están almacenados en el lado del servidor.

<?php
session_start();
<*>

si su nombre de usuario es diferente o único, puede usar este código para la sesión

SESSION['username']="username"; ?> <!DOCTYPE html> <html> <head> <title>Update</title> </head> <body> <table border="2"> <tr> <th>Username</th> <th>Email</th> <th>Edit</th> </tr> <?php $conn=mysqli_connect("localhost","root","","telephasic"); $q2="select * from register where username = '".<*>

si su nombre de usuario es diferente o único, puede usar este código para la sesión

SESSION['username']."'"; $run=mysqli_query($conn, $q2); while($row=mysqli_fetch_array($run)) { $name=$row[1]; $email=$row[2]; ?> <tr> <td><?php echo $name; ?></td> <td><?php echo $email; ?></td> <td><a href="edit.php"> Edit </a></td> </tr> <?php } ?> </table> </body>

si su nombre de usuario es diferente o único, puede usar este código para la sesión

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top