Quanto è unico l'id della sessione php? Ho avuto l'impressione da varie cose che ho letto che non dovrei fare affidamento sul fatto che due utenti non ottengano mai lo stesso sessionid. Non è un GUID?
Risposte:
Session_id può effettivamente essere duplicato, ma la probabilità è molto bassa. Se si dispone di un sito Web con un traffico equo, potrebbe accadere una volta nella vita del sito Web e infastidirà un utente per una sessione.
Non vale la pena preoccuparsi di questo a meno che non ti aspetti di costruire un sito web ad alto traffico o un servizio per il settore bancario.
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 trarre 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" nel codice per l'algoritmo effettivo che stanno utilizzando.
Modificato per aggiungere: c'è un generatore di numeri casuali DFA seminato dal pid, mescolato con il tempo in usecs. Non è una condizione di unicità costante, soprattutto dal punto di vista della sicurezza . Usa la configurazione dell'entropia sopra.
Aggiornare:
A partire da PHP 5.4.0 session.entropy_file ha come impostazione predefinita / dev / urandom o / dev / arandom se disponibile. In PHP 5.3.0 questa direttiva è lasciata vuota per impostazione predefinita. Manuale PHP
Se vuoi sapere come PHP genera un ID di sessione per impostazione predefinita, controlla il codice sorgente su Github . Non è certamente casuale e si basa su un hash (predefinito: md5) di questi ingredienti (vedere la riga 310 dello snippet di codice):
Se il sistema operativo ha una fonte casuale disponibile, la forza dell'ID generato allo scopo di essere un ID di sessione è alta ( / dev / urandom e altre fonti casuali del sistema operativo sono (di solito) PRNG crittograficamente sicuri ). Se invece non lo fa allora è soddisfacente.
L'obiettivo con la generazione dell'identificazione della sessione è:
Ciò è ottenuto dall'approccio di PHP alla generazione di sessioni.
Non puoi garantire in modo assoluto l'unicità , ma le probabilità di ottenere lo stesso hash due volte sono così basse che, in generale, non vale la pena preoccuparsi.
È possibile installare una funzione di generazione hash alternativa se si desidera personalizzare il modo in cui viene generato l'ID (è un numero a 128 bit generato tramite MD5 per impostazione predefinita). Vedi http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
Per ulteriori informazioni sulle sessioni PHP, prova questo eccellente articolo http://shiflett.org/articles/the-truth-about-sessions che contiene anche collegamenti ad altri articoli sulla correzione e il dirottamento delle sessioni.
Dimensione di session_id
Supponiamo che seeion_id sia distribuito uniformemente e abbia dimensione = 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 70mila miliardi. Quindi la dimensione di 128 bit di session_id dovrebbe essere abbastanza grande. Come accennato in altri commenti, il session_manager potrebbe anche controllare che il nuovo session_id non esista già.
Casualità
Quindi la grande domanda penso sia se i session_id: s siano generati con una buona pseudo casualità. Su questo non si può mai essere sicuri, ma consiglierei di utilizzare una soluzione standard ben nota e utilizzata di frequente per questo scopo (come probabilmente già fai).
Anche se le collisioni vengono evitate grazie al controllo, la casualità e la dimensione di session_id sono importanti, in modo che gli hacker non possano, 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 del dirottamento della sessione di cui le persone sono preoccupate è quando qualcuno scopre l'ID di sessione di un utente attivo. Questo può essere prevenuto in molti modi, per maggiori informazioni su questo puoi vedere questa pagina su php.net e questo documento sulla correzione della sessione
No, l'ID di sessione non è un GUID, ma due utenti non dovrebbero ottenere lo stesso ID di sessione poiché sono archiviati sul lato server.
<?php
session_start();
$_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 = '".$_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 univoco puoi utilizzare questo codice per la sessione