Domanda

Quanto è unico l'id della sessione php? Ho avuto l'impressione da varie cose che ho letto che non dovrei fare affidamento su due utenti che non ottengono mai lo stesso sessionid. Non è un GUID?

È stato utile?

Soluzione

Session_id può davvero essere duplicato, ma la probabilità è molto bassa. Se si dispone di un sito Web con un traffico equo, ciò può accadere una volta nella vita del sito Web e infastidire un utente per una sessione.

Non vale la pena preoccuparsene a meno che non ci si aspetti di costruire un sito Web a traffico molto elevato o un servizio per il settore bancario.

Altri suggerimenti

Non è molto unico come spedito. Nella configurazione predefinita è il risultato di un hash di varie cose incluso il risultato di gettimeofday (che non è terribilmente unico), ma se sei preoccupato, dovresti configurarlo per attirare un po 'di entropia da / dev / urandom, in questo modo

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

cerca " php_session_create_id " in il codice per l'algoritmo effettivo stanno usando.

Modificato per aggiungere: C'è un generatore di numeri casuali DFA generato dal pid, mischiato al tempo in usecs. Non è una condizione di unicità unica soprattutto dal punto di vista della sicurezza . Usa la configurazione di entropia sopra.

Aggiornamento:

  

A partire da PHP 5.4.0 session.entropy_file il valore predefinito è / dev / urandom o   / dev / arandom se è disponibile. In PHP 5.3.0 questa direttiva è rimasta   vuoto per impostazione predefinita. Manuale PHP

Se vuoi sapere come PHP genera un ID sessione di default controlla il codice sorgente su Github . Non è certo casuale e si basa su un hash (predefinito: md5) di questi ingredienti (vedere la riga 310 dello snippet di codice):

  1. Indirizzo IP del client
  2. Ora corrente
  3. PHP Linear Congruence Generator - un generatore di numeri pseudo casuali (PRNG)
  4. Sorgente casuale specifica del sistema operativo - se il sistema operativo ha una fonte casuale disponibile (ad es. / dev / urandom)

Se il sistema operativo ha una fonte casuale disponibile, la forza dell'ID generato allo scopo di essere un ID sessione è alta ( / dev / urandom e altre fonti casuali del sistema operativo sono (di solito) PRNG crittograficamente sicuri ). Se tuttavia non lo è, allora è soddisfacente.

L'obiettivo con la generazione dell'identificazione della sessione è:

  1. minimizza la probabilità di generare due ID sessione con lo stesso valore
  2. rende molto difficile dal punto di vista computazionale generare chiavi casuali e premerne una in uso .

Ciò si ottiene con l'approccio di PHP alla generazione di sessioni.

Non puoi assolutamente garantire l'unicità , ma le probabilità sono così basse di colpire lo stesso hash due volte di cui, in generale, non vale la pena preoccuparsi.

È possibile installare una funzione di generazione di hash alternativa se si desidera personalizzare il modo in cui l'ID viene generato (è un numero a 128 bit generato tramite MD5 per impostazione predefinita). Vedi http://www.php.net/ manuale / it / session.configuration.php # ini.session.hash funzione

Per ulteriori informazioni sulle sessioni PHP, prova questo eccellente articolo http://shiflett.org / articoli / la verità sulle sessioni che collega anche ad altri articoli sulla fissazione della sessione e sul dirottamento.

Dimensione di session_id
Supponiamo che seeion_id sia distribuito uniformemente e abbia dimensioni = 128 bit. Supponiamo che ogni persona sul pianeta acceda una volta al giorno con una nuova sessione persistente per 1000 anni.

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 

Quindi la probabilità di una o più collisioni è inferiore a una su 70 mila miliardi. Quindi la dimensione a 128 bit di session_id dovrebbe essere abbastanza grande. Come menzionato in altri commenti, session_manager potrebbe anche verificare che il nuovo session_id non esista già.

La casualità
Quindi la grande domanda che penso è se session_id: s siano generati con una buona pseudo casualità. Su questo non puoi mai esserne sicuro, ma consiglierei di utilizzare una soluzione standard ben nota e utilizzata di frequente per questo scopo (come probabilmente già fai).

Anche se le collisioni sono evitate a causa del controllo, la casualità e le dimensioni di session_id sono importanti, quindi gli hacker non possono, in qualche modo fare ipotesi qualificate e trovare session_id: s attive con grande probabilità.

Non ho trovato una conferma su questo, ma credo che php controlli se esiste già un ID di sessione prima di crearne uno con quell'ID.

Il problema di dirottamento della sessione di cui le persone sono preoccupate è quando qualcuno scopre l'id di sessione di un utente attivo. Questo può essere evitato in molti modi, per maggiori informazioni su questo puoi vedere questa pagina su php.net e questo documento sulla fissazione della sessione

No, l'ID sessione non è un GUID, ma due utenti non devono ottenere lo stesso ID sessione archiviato sul lato server.

<?php
session_start();
<*>

se il tuo nome utente è diverso o unico puoi usare questo codice per la sessione

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 = '".<*>

se il tuo nome utente è diverso o unico puoi usare questo codice per la sessione

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>

se il tuo nome utente è diverso o unico puoi usare questo codice per la sessione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top