2010-07-02 12 views
14

Sto cercando di impostare uno script di recupero password php, utilizzando un token che scade dopo 24 ore, ma non sono sicuro di come procedere. Ho le password utente SHA1 crittografate al momento, tutto quello che voglio fare è aggiungere un token all'url che viene inviato all'utente quando richiedono una reimpostazione della password, ma come faccio a farlo correttamente e cosa devo fare? bisogno di memorizzare nel database?Guida PHP con ripristino della password e scadenza del token

risposta

3

È necessario memorizzare un timestamp univoco e un timestamp di scadenza del token. Quando gli utenti visitano l'URL univoco, è necessario convalidare il token, il nome utente e la data/ora di scadenza del token. Se tutto è a posto, è possibile inviare una nuova password o visualizzare un modulo in cui l'utente può impostare una nuova password.

+1

Aggiungo che quando l'utente accede alla pagina 'reset' si ottiene il token e la data di scadenza dal DB e si verifica SE esiste e SE è ancora valido. Se è troppo vecchio, lo si elimina dal DB. Se qualcuno di questi due, gli mostri la pagina di errore. Beh, questo può essere ovvio :) –

+0

Sì, hai ragione, la mia soluzione è solo uno scheletro, quindi disegno: "Se tutto va bene" – fabrik

31
  1. Quando l'utente richiede una reimpostazione della password, generare un token e calcolare la data di scadenza
  2. Conservare il token e la data di scadenza in colonne separate nella tabella degli utenti per l'utente
  3. Invia un'email al utente contenente il link di reset, con il token allegata alla sua URL
  4. Quando l'utente segue il link, afferrare il token dal tuo URL (magari con $_GET['token'])
  5. Verificare il token contro la vostra tabella utenti
  6. Verificare che non è oltre la sua data di scadenza ancora
    • Se è scaduto, invalidare, forse cancellando i campi, e permettono all'utente di inviare nuovamente
  7. Se il token è valido e utilizzabile, presente il modulo di reimpostazione password per l'utente
  8. Convalida e aggiornare la password e cancellare i campi di token e di scadenza
+1

Suono consiglio; tuttavia, probabilmente, vale la pena notare che poiché tali token sono "equivalenti alla password", non dovrebbero essere archiviati nudi nel database: salateli e cancellateli come fanno le password degli utenti. – eggyal

0

vorrei andare su di esso attraverso la creazione di un altro database chiamato pessword_reset_sessions.

In modo che è possibile memorizzare le seguenti:

userid generalhash userhash timeinititated tentativi

poi con id utente isnert l'OBV id utente, con hash generale è un hash che non viene mostrato per l'utente ma usato per creare l'userhash.

timeinitiated deve essere un Timestamp UNIX di quando ha richiesto per la prima volta una nuova password.

dopo aver confermato che l'utente che sta richiedendo la password ha inserito le informazioni di convalida come e-mail, nome, domanda segreta. crei una riga all'interno della tabella di reimpostazione della password.

ed emettere un'e-mail contenente userhash.

quando l'hash torna tramite il $_GET['hash'] si quindi si crea un altro hash dal generalhash da confrontare con l'hash che vengono tramite $ _GET [], se l'hash non corrisponde poi si incrementerà il attempts

voi puoi anche controllare in anticipo per assicurarti che non abbia fatto scattare la sicurezza per 2 tentativi.

8

Non utilizzerei affatto un database. Ma crittografia unidirezionale.
Basta inviare le informazioni necessarie nel collegamento ipertestuale fornito nella mail, firmato dall'hash. Qualcosa di simile

$token = sha1($user_id.$time.$user_pass.$salt).dechex(time()).dechex($user_id); 
$link = "http://".$domain."/restorepass/?token=$token"; 

Ricevendo solo dividere e decodificare indietro, e quindi controllare hash e il timeout.

+0

Woow, questo è intelligente :) Non lo userà, ma sembra buono :) Lo usi effettivamente da qualche parte? –

+0

Perché "dechex (time())"? Perché è meglio che fare: "? Token = $ token & time = $ time & userid = $ user_id"? – boblapointe

+2

Penso che questo non sia affidabile, perché un utente malintenzionato potrebbe modificare un vecchio token con un nuovo dechex (time()) per riutilizzarlo. – alvaropgl

Problemi correlati