it-swarm.dev

Qualcuno può fornire riferimenti per implementare correttamente i meccanismi di reimpostazione della password automatica dell'applicazione Web?

Stiamo implementando la reimpostazione automatica della password in un'applicazione Web e so come voglio farlo (URL di reimpostazione della password con tempo limitato di posta elettronica agli utenti con indirizzo di posta elettronica pre-registrato).

Il mio problema è che non riesco a trovare riferimenti per indirizzare gli sviluppatori a usare questa tecnica. Qualcuno può indicarmi la direzione di alcuni buoni riferimenti su questa tecnica?

96
bdg

Alcuni suggerimenti:

Non reimpostare la password dell'utente fino alla conferma. Non reimpostare immediatamente la password dell'utente. Reimpostalo solo quando l'utente fa clic su un link di conferma inviato al suo indirizzo e-mail pre-registrato.

Richiede un CAPTCHA. Quando un utente richiede il ripristino della password, forzalo a risolvere un CAPTCHA prima di procedere ulteriormente. Questo per impedire agli strumenti automatici di provare dolore per molti utenti e costringere l'utente a dimostrare di essere un essere umano (non un robot).

Casualità. L'URL di reimpostazione della password a tempo limitato dovrebbe includere un componente casuale e non indovinabile. Assicurati di usare casualità di qualità crittografica. L'output di /dev/urandom O System.Security.Cryptography.RNGCryptoServiceProvider Sarebbe una buona scelta. L'output di Rand() o random() o System.Random Non è abbastanza casuale e sarebbe una scelta sbagliata. A GUID o timestamp non è abbastanza casuale e non sarebbe una buona scelta.

Includi un limite di tempo. Il link di conferma del ripristino dovrebbe scadere dopo un periodo di tempo ragionevole: diciamo, 24 ore. Il collegamento dovrebbe essere utilizzabile una sola volta e dovrebbe scadere immediatamente non appena viene utilizzato.

Includi testo esplicativo nell'e-mail. Potresti voler aggiungere un testo esplicativo all'e-mail, per spiegare perché l'email è stata inviata, nel caso in cui qualcuno richieda un reimpostare per un account che non è tuo. Potresti includere del testo come "Qualcuno ha richiesto la reimpostazione della password per il tuo account username su site. Se hai effettuato questa richiesta, fai clic qui per modificare la password. Se non hai effettuato questa richiesta, clicca qui per annullare la richiesta. "

Invia e-mail dopo aver reimpostato la password. Dopo aver reimpostato la password, invia e-mail all'utente per far loro sapere che la password è stata modificata. Non includere la nuova password in quell'email.

Monitora le cancellazioni. Potresti considerare di includere alcune logiche per monitorare la frequenza con cui gli utenti fanno clic sul link di cancellazione indicando che non hanno richiesto una reimpostazione. Se questo supera una determinata soglia, potrebbe essere utile inviare un avviso agli operatori di sistema. Inoltre, se viene visitato un link di annullamento per qualche richiesta dopo viene visualizzato il link di conferma, ciò è una potenziale indicazione di un attacco contro quell'utente - potresti voler agire in quel punto, ad es. , invalidare la password dell'utente e richiedere loro di reimpostare nuovamente la password. (Questa è una difesa contro il seguente attacco: l'attaccante ottiene l'accesso alla cassetta postale dell'utente, quindi richiede che la sua password sul tuo sito venga ripristinata, quindi visita il link di conferma. Se l'attaccante non cancella queste email dalla posta in arrivo dell'utente, quindi quando l'utente reale legge la propria e-mail, può fare clic sul collegamento di annullamento, dandoti un'indicazione di possibili problemi.)

Usa HTTPS. Il collegamento dovrebbe usare https (non http :), per proteggere da vari attacchi (ad esempio, attacchi Firesheep su utenti che navigano sul web da Internet bar).

Registra queste operazioni. Suggerisco di registrare tutte queste richieste. Oltre a registrare il nome utente dell'utente, è possibile registrare l'indirizzo IP del client che ha richiesto l'invio di un messaggio di posta elettronica all'utente e l'indirizzo IP del client che ha visitato il collegamento di ripristino.

Letture aggiuntive. Potresti anche voler leggere l'eccellente post sul blog di Troy Hunt, Tutto ciò che avresti sempre voluto sapere sulla creazione di una funzione di reimpostazione sicura della password . Grazie a @coryT per un link a questa risorsa.

Infine, considera l'autenticazione senza password. Le password hanno molti problemi come meccanismo di autenticazione e potresti prendere in considerazione altri metodi di autenticazione degli utenti, come la memorizzazione di una sicurezza cookie persistente sulla loro macchina con un segreto indiscutibile per autenticarli. In questo modo, non vi è alcuna password da dimenticare e nessun modo per l'utente di essere phishing, anche se è necessario fornire un modo per un utente di autorizzare l'accesso da una nuova macchina o un nuovo browser (possibilmente via e-mail al indirizzo email registrato). Questo documento di indagine ha un eccellente sondaggio di molti metodi di autenticazione di fallback e dei loro punti di forza e di debolezza.

93
D.W.
15
coryT

Qualsiasi luogo che può inviarti una password significa che non ha la password con hash, ma la memorizzano dove è in qualche modo decodificabile in 'testo in chiaro'. Questo di per sé è negativo.

Probabilmente non "più" sicuro, ma più sicuro sarebbe:

Su richiesta della password, inviare un collegamento di reimpostazione della password all'utente con GUID incorporato. La sessione in GUID scade tra, hmm, ora o giù di lì.

9
Rich Homolka

OK, quindi la tua domanda è: come strutturare il processo di recupero password/account? Ciò dipenderà da ciò che desideri ottimizzare: esperienza utente senza problemi o buona sicurezza.

Se vuoi una buona sicurezza:

  • Durante la registrazione, l'utente deve inserire il suo indirizzo email.
  • Durante la registrazione, l'utente deve inserire un canale secondario per l'autenticazione: numero di cellulare o domanda e risposta (ovvero " qual è il nome da nubile di tua madre " o migliore).

  • Durante il ripristino, il sistema prima ottiene una verifica approssimativa dell'identità tramite il canale secondario sopra - la domanda di verifica, o inviando un codice SMS al telefono cellulare o simili.

  • Quando il primo controllo di identità sopra viene cancellato, il sistema invia un'e-mail di reimpostazione della password solo all'indirizzo e-mail precedentemente inserito. Questa è un'ulteriore misura importante per prevenire f.x. exploit di tipo Sarah Palin .

  • L'email non deve contiene una nuova password o simili. Dovrebbe avere un collegamento cliccabile a una pagina Web crittografata HTTPS sul tuo sito che a) è collegato all'account tramite un valore segreto non indovinabile fornito nell'URL, b ) è limitato nel tempo, quindi il recupero dell'account funziona solo per x ore dopo che è stato richiesto, c) fornisce un modo per l'utente finale di creare un nuovo password.

  • Avere una buona registrazione su tutte le transazioni di reimpostazione dell'account e fare in modo che un essere umano le controlli effettivamente e agisca se sembrano sospette (guardare i registri del server per gli indirizzi IP fx, molte richieste provengono dallo stesso indirizzo IP, ci sono istanze che sono state un l'utente sta tentando di reimpostare le password di un Paese diverso dal proprietario dell'account registrato, ecc.).

Puoi anche eludere del tutto questa complessità: È ancora agli inizi, ma OAuth/OpenID/accedi tramite Facebook, Google etc rimuove completamente questa complessità dai tuoi sistemi, ma con un forse usabilità meno consolidata .

9
Jesper M

Il modo più sicuro per eseguire una reimpostazione della password è generare un token di reimpostazione una tantum unico casuale, con una data di scadenza, associato all'ID utente. Il token deve essere sottoposto a hash nel database, poiché un utente malintenzionato con accesso SQL potrebbe utilizzarlo per reimpostare password utente arbitrarie.

È necessario inviare un collegamento di reimpostazione all'indirizzo e-mail, contenente il token di reimpostazione. Quando l'utente fa clic sul collegamento, l'hash del token deve essere trovato nel database e la data di scadenza deve essere verificata in futuro. Se tali condizioni sono soddisfatte, all'utente dovrebbe essere visualizzata una schermata che consente di digitare una nuova password.

L'intero processo deve deve essere eseguito su SSL, altrimenti un utente malintenzionato potrebbe annusare l'URL e reimpostare la password prima che l'utente lo faccia.

Alcuni altri consigli:

  1. Domande segrete un piccolo fastidio per gli aggressori e un grande fastidio per gli utenti. Evitali completamente.
  2. Presenta all'utente una sfida di verifica umana (ad esempio un CAPTCHA) prima di inviare la reimpostazione della password. Ciò impedisce richieste di ripristino automatizzate.
  3. Controllare se l'indirizzo IP che esegue il ripristino è uno che ha effettuato correttamente l'accesso all'account in precedenza. In caso contrario, chiedi ulteriori dettagli sull'account/utente, ad es. anno di creazione dell'account, data di nascita, prima riga dell'indirizzo.
  4. Aggiungi un link "Non ho richiesto questa email", in modo che gli utenti possano segnalare richieste errate di reimpostazione della password.
6
Polynomial

Un altro che può essere o non essere appropriato per la tua applicazione, ma viene utilizzato nelle applicazioni di online banking e simili cose è inviare metà del codice di reset di SMS messaggistica a un telefono cellulare registrato. Dal punto di vista di un attaccante, questo è un PITA completo in quanto richiede un compromesso di un paio di canali per essere interrotto.

6
Rory Alsop

Autenticazione a 2 fattori tramite SMS! 1 conosci il cliente e il suo numero di cellulare, SMS loro un codice univoco da aggiungere al sito Web per convalidarlo: )

0
frank

Renderlo in pochi passaggi. Ad esempio qualcosa del genere:

  1. L'utente ha dimenticato la password. Fa clic sul pulsante "Ho dimenticato la password inviami una e-mail cosa fare dopo" (l'etichetta del pulsante potrebbe essere diversa;))
  2. Il tuo server gli manda un link www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. Fa clic sul collegamento ed è in grado di crearsi una nuova password
  4. Fa clic su Invia. Tutto fatto. Tutti felici

Una sola cattura è al punto 3). I valori X e Y dovrebbero essere casuali, imprevedibili e collegati a questo particolare account. Dovrebbero anche essere solo una volta e dovrebbero diventare stantii dopo un breve periodo di tempo (24 ore?). Memorizzare entrambi i valori in una tabella dedicata con le colonne corrispondenti:

| some_id | user_id | X | Y | expire_time

Se un utente tenta di utilizzare il collegamento corretto, controlla se il tempo di scadenza non è rispettato e, in caso contrario, consentigli di modificare la password.

0
Andrzej Bobak