2009-05-18 15 views
19

Dopo aver sottoscritto l'e-mail al mio sito web. Il mio sito web genererà un'email di conferma e invierà a loro. Nel contenuto della posta, ho bisogno di includere chiave di attivazione, qualcosa di simile:Come generare una stringa di attivazione sicura in php?

www.domain.com/activate.php?key=$generatedKey

Come si fa a generare la chiave? usando sha1 ($ email) ??

Dopo aver generato la chiave, la memorizzo nel database, in modo che quando l'utente fa clic sul collegamento posso verificarlo con il database ?? Sono nuovo di esso, si prega di avvisare .. Ho bisogno di uno script Conferma ..

risposta

24

Personalmente, solo io uso una combinazione di cose come:

$generatedKey = sha1(mt_rand(10000,99999).time().$email); 

La probabilità di collisione è piccola, ma vi consiglio controllare il tuo database prima di inviarlo (usare i vincoli UNIQUE è un modo semplice).

+5

Nessuna possibilità di collisione è aggiungere l'ID utente all'URL e controllare che entrambi corrispondano. – Eli

+0

@Eli, c'è una possibilità, dato che alcune raccolte di caratteri eseguono l'hash sulla stessa stringa di hash. Anche se la possibilità è abbastanza trascurabile (ma ancora lì). – alex

+2

Ehh, non sono un fan di rivelare le informazioni sulla chiave primaria all'utente. Ma questa è una buona idea, Eli. quindi key = $ generatedKey & id = $ uid –

1
$guid=md5(uniqid(mt_rand(), true)); 
0

che dovrebbe farlo, ma si può migliorare con l'aggiunta di un pizzico di sale, ad esempio:

$key = sha1($email . 'doYouLikeSauce'); 

altro approccio è solo quello di generare una password casuale e inviarlo via e-mail.

1

Se si memorizza la stringa di attivazione nel database e si verifica in un secondo momento, non è necessario alcun hash!

Hai solo bisogno di una lunga stringa casuale. Puoi generarlo come vuoi, basta allungarlo. In realtà, dovrebbe idealmente non avere nulla a che fare con l'e-mail o il nome utente.

+1

Ecco perché sha1, md5 e altre funzioni di crypt sono buone in quanto creano stringhe apparentemente casuali. Se vuoi stringhe che sono uniche (bassa collisione), la soluzione migliore è basarle su alcune costanti uniche (email) e alcune salature aggiuntive. –

+2

Le funzioni di hash non aggiungono alcuna entropia in modo da non rendere le collisioni più o meno probabili in questo caso. Loro * sembrano * più casuali per noi umani. – Eli

7

Che, fondamentalmente, hanno alcune opzioni:

1) Creare un unico identificatore unico che è apparentemente casuale e memorizzarlo nel database con il quale nome utente corrisponde al

2) generare una password casuale e comprendono l'ID utente e la password nel collegamento e memorizzare la password nel database

3) Utilizzare una funzione di hashing unidirezionale (md5, sah1, ecc.) e un identificatore segreto per crittografare l'identificativo utente. Non è necessario memorizzare l'identificatore utente crittografato nel database.

L'opzione 1 è difficile perché è necessario controllare il database per verificare se la chiave esiste già. Tuttavia, è bello che l'URL non contenga il nome utente attivato.

Se si sta già utilizzando una sorta di database per memorizzare le informazioni dell'utente (probabilmente una password al minimo) in futuro, si potrebbe andare con l'opzione 2. Non ci vuole molto per aggiungere un'altra colonna a il tuo database Quando invii l'email, salva il nome utente e qualcosa come $ key = sha1 (rand (1, 99999). $ Username) in un'altra colonna per la riga che contiene il nome utente. Quindi il tuo link ha il seguente aspetto: http://you.com/activation.php?user= $ username & key = $ key. In activation.php si controlla se la chiave è uguale al valore memorizzato nel database.

Se si desidera utilizzare meno spazio di archiviazione nel database, l'opzione 3 funzionerà. Puoi usare qualcosa come $ key = sha1 ($ mysecret. $ Username) come identificatore segreto. Usa qualcosa di strano che conosci solo come $ mysecret come 'aaafj_my_secret_adfaf'. Utilizza lo stesso tipo di URL dell'opzione 2.Tuttavia, poiché è possibile generare una chiave $ basata solo su $ username, non è necessario memorizzarla. Quindi quando stai elaborando in activation.php, controlla se sha1 ($ mysecret. $ _GET [username]) == $ _GET [chiave]. Se lo fa, sai di avere l'utente corretto. In teoria, con registrazioni sufficienti, qualcuno potrebbe capire il tuo valore per $ mysecret e generare anche le chiavi di attivazione. Tuttavia, si noterebbero sicuramente i miliardi o più di registrazioni che sarebbe necessario prima che iniziassero a calcolare di che cosa si tratta. Il numero di attivazioni richieste si basa sulla dimensione della chiave della funzione di hashing. Usa sha1 (160 bit) vs md5 (128 bit) per rendere più difficile indovinare il tuo valore $ mysecret.

+1

Ottimo riassunto delle opzioni e dei loro pro e contro! Vorrei solo aggiungere che, indipendentemente dall'opzione scelta, ci sono alcuni "invarianti" che sono veri per tutti loro. Ad esempio: 1. Il link di attivazione deve essere univoco, nel suo insieme, perché se non lo è, non puoi dire quale utente attivare. 2. Devi memorizzare almeno l'indirizzo e-mail nel tuo DB, e deve essere anche unico. In questa vista, il cono della prima opzione non è tanto una truffa, perché finirai per controllare l'univocità comunque (almeno l'indirizzo e-mail). – SasQ

0
$code = md5($_POST['username'] . microtime()); 
Problemi correlati