2012-09-03 10 views

risposta

30

Dipende session.hash_function e session.hash_bits_per_character.

controllare la pagina session_id per maggiori informazioni.

Più alto si imposta session.hash_bits_per_character più breve tuo session_id diventerà utilizzando più bit per carattere. I possibili valori sono 4, 5 o 6.

Quando si utilizza SHA-1 per l'hashing (modificando ini_set ('session.hash_function', 1) la seguente stringa sessione lunghezze sono prodotte dai tre sessione. hash_bits_per_character impostazioni:

4 - 40 stringa di caratteri

5 - 32 stringa di caratteri

6 - 27 stringa di caratteri

+0

Quindi 40 caratteri sono un set sicuro, e se voglio salvare alcuni byte, devo controllare la configurazione php, giusto? – Gustavo

+0

Controllare php.ini per vedere quali sono le impostazioni. 40 caratteri è il risultato della funzione hash SHA-1 e di 4 bit per carattere. Puoi fare 'echo strlen (session_id());' per vedere la lunghezza e rendere il campo del tuo database di conseguenza. – sachleen

+3

Per riferimento, la lunghezza session_id sarà anche 32 se si utilizza la funzione hash MD5 e 4 bit hash per carattere. Questo mi ha fatto strappare i capelli per alcune ore oggi. – sevenseacat

4

Dipende da queste impostazioni di configurazione: session.hash_function e session.hash_bits_per_character

Shorter sessione lunghezze d'identità hanno la maggiore probabilità di collisione, ma questo dipende anche molto dal algoritmo di generazione ID. Date le impostazioni predefinite, la lunghezza dell'ID di sessione dovrebbe essere appropriata per la maggior parte delle applicazioni. Per implementazioni di maggiore sicurezza, puoi considerare come PHP genera i suoi ID di sessione e verificare se è crittograficamente sicuro. In caso contrario, è necessario eseguire il rollover del proprio algoritmo con una fonte di casualità crittograficamente sicura.

+3

La probabilità di collisione è totalmente determinato dalla funzione di hash, entropia utilizzato, e il volume di traffico. L'uso di una funzione di hashing più sicura produrrà una stringa ID di sessione più ampia, quindi se questo è ciò che intendevi per lunghezze di ID di sessione più brevi con una maggiore probabilità di collisione, sei corretto, ma abbrevia la lunghezza utilizzando una maggiore profondità di bit per carattere non avrà alcun effetto. – Jason

+0

L'ID di sessione di 128 caratteri è un overkill per un'applicazione Web generica? – TheFrost

26

La risposta @sachleen non è completa.
Ulteriori informazioni sulla lunghezza dell'ID di sessione sono descritte here.

Sommario:

128-bit digest (MD5) 
4 bits/char: 32 char SID  
5 bits/char: 26 char SID  
6 bits/char: 22 char SID 

160-bit digest (SHA-1) 
4 bits/char: 40 char SID  
5 bits/char: 32 char SID  
6 bits/char: 27 char SID 

E regex campione per controllare Session ID:

preg_match('/^[a-zA-Z0-9,-]{22,40}$/', $sessionId) 
+1

questo è stato utile per me !!! – SirJ

+3

Ottima risposta, il pezzo mancante di un puzzle per me. –

0

non so dove verrà utilizzata la mia domanda di allora ho impostato come: VARCHAR (127) e spero che sia perfetto per gli utenti MySQL non conosciuti.

+1

Se per sconosciuto vuoi dire sconosciuto, potresti prendere in considerazione l'impostazione come TESTO che si contrarrà e si espanderà secondo necessità, altrimenti avrai un sacco di spazio vuoto nella tua tabella, e anche così, potrebbe fallire con un valore di lunghezza di 128 . – Gustavo

+0

@GustavoPinent VARCHAR è più veloce di TEXT. –

+0

@TichomirMitkov sì, dovrà decidere tra TESTO sicuro e flessibile e VARCHAR veloce – Gustavo

0

Entro la normale lunghezza di installazione PHP è sempre 26 (ExMP: psprdaccghmmre1oo2eg0tnpe6)

Problemi correlati