2009-06-30 12 views
51

Le applicazioni inviano e-mail per verificare gli account utente o reimpostare una password. Credo che quanto segue sia il modo in cui dovrebbe essere e chiedo riferimenti e implementazioni.Quali sono le migliori pratiche per i link di attivazione/registrazione/reimpostazione password nelle e-mail con nonce

Se un'applicazione deve inviare un link in una e-mail per verificare l'indirizzo dell'utente, secondo il mio punto di vista, il collegamento e l'elaborazione dell'applicazione del collegamento dovrebbe avere le seguenti caratteristiche:

  1. Il link contiene un nonce nell'URI della richiesta (http://host/path?nonce).
  2. Seguendo il collegamento (GET), all'utente viene presentato un modulo, facoltativamente con il nonce.
  3. L'utente conferma l'input (POST).
  4. Il server riceve la richiesta e
    • parametri di controlli di input,
    • esegue il cambiamento,
    • e invalida la nonce.

Questo dovrebbe essere corretto per HTTP RFC on Safe and Idempotent Methods.

Il problema è che questo processo comporta una pagina aggiuntiva o un'azione utente (elemento 3), che è considerata superflua (se non inutile) da molte persone. Ho avuto problemi a presentare questo approccio a colleghi e clienti, quindi chiedo un input su questo da un gruppo tecnico più ampio. L'unico argomento che ho avuto contro saltare il passaggio POST era un possibile precaricamento del collegamento dal browser.

  • Ci sono riferimenti su questo argomento che potrebbero spiegare meglio l'idea e convincere anche una persona non tecnica (best practice da riviste, blog, ...)?
  • Ci sono siti di riferimento (preferibilmente popolari e con molti utenti) che implementano questo approccio?
    • In caso negativo, esistono motivi documentati o alternative equivalenti?

Grazie,
Kariem


dettagli risparmiato

ho conservato la parte principale breve, ma per ridurre troppo la discussione attorno ai dettagli che ho avuto lasciato intenzionalmente, aggiungerò alcune ipotesi:

  • Il contenuto dell'e-mail non è parte di questa discussione. L'utente sa che deve fare clic sul collegamento per eseguire l'azione. Se l'utente non reagisce, non accadrà nulla, che è anche noto.
  • Non è necessario indicare perché stiamo inviando messaggi all'utente, né la politica di comunicazione. Supponiamo che l'utente si aspetti di ricevere l'email.
  • Il nonce ha una data/ora di scadenza ed è direttamente associato all'indirizzo e-mail del destinatario per ridurre i duplicati.

Note

Con OpenID e simili, normali applicazioni web sono sollevati da attuare standard di gestione account utente (password, e-mail ...), ma ancora alcuni clienti vogliono 'loro propri utenti '

Stranamente non ho trovato una domanda soddisfacente né risposta ancora qui. Quello che ho trovato finora:

+1

correlati [di sicurezza] (http://security.stackexchange.com/q/40512/61220) e [UX] (http://ux.stackexchange.com/q/33014/33282) domande su il tema. –

risposta

22

Questa domanda è molto simile a Implementing secure, unique “single-use” activation URLs in ASP.NET (C#).

La mia risposta non è vicino al vostro schema, con alcuni problemi di rilevare - come il breve periodo di validità, la manipolazione doppie iscrizioni, ecc
L'utilizzo di un crittografico nonce è anche importante, che molti tendono saltare sopra - es "lascia solo usare un GUID" ...

Un nuovo punto che si alza, e questo è importante qui, è l'idempotenza di GET.
Mentre sono d'accordo con il vostro intento generale, è chiaro che l'idempionalità è in diretta contraddizione con i collegamenti di una volta, che è una necessità in alcune situazioni come questa.

mi sarebbe piaciuto a postulare che questo in realtà non viola l'idempotentness del GET, ma purtroppo lo fa ... D'altra parte, l'RFC dice GET DEVONO essere idempotente, il suo non è un MUST.Quindi direi di rinunciarvi in ​​questo caso, e attenersi ai collegamenti una tantum auto invalidati. (?)

Se davvero vuole puntare per il rigoroso rispetto RFC, e non entrare in non idempotente arriva, si può avere la pagina di GET auto-presentare il POST - una specie di scappatoia intorno a quel po 'di RFC, ma legit, e tu non richiedi all'utente di raddoppiare, e non lo stai insidiando ...

Non devi preoccuparti del precarico (stai parlando di CSRF o di ottimizzatori del browser?) ... CSRF è inutile a causa del nonce, e di solito gli ottimizzatori non elaborano javascript (utilizzato per l'invio automatico) nella pagina precaricata.

+0

Grazie, per il puntatore AviD. Buona soluzione per avere javascript sulla prima pagina inviare il POST. Ciò non infastidisce l'utente e si conforma alla RFC. Ho pensato al browser che precarica un URL che viene visualizzato nel corpo di un client webmail. Questo sicuramente non eseguirà codice javascript sulla pagina web di destinazione. Questa è una buona proposta ... hai qualche riferimento in cui qualcosa di simile è implementato? – Kariem

+0

In questo momento, ho potuto solo pensare ai riferimenti ad alcuni dei miei clienti di consulenza (che non posso davvero rivelare) ... Non mi preoccupo più di notare altri siti più ... Scusa. – AviD

1

io generalmente d'accordo con te con alcune modifiche suggerito di seguito.

  1. I registri degli utenti sul sito forniscono un'e-mail.
  2. di verifica e-mail viene inviata agli utenti di account con due link: a) Un legame con il GUID per verificare la registrazione b) Un legame con il GUID di respingere la verifica
  3. quando visitano l'URL di verifica da loro e-mail vengono verificati automaticamente e il codice di verifica è contrassegnato come tale nel sistema.
  4. Quando visitano l'URL di rifiuto dalla loro e-mail, vengono automaticamente rimossi dalla coda delle verifiche possibili ma, ancora più importante, puoi dire all'utente che ti dispiace per la registrazione e-mail e dare loro ulteriori opzioni come rimuovere la loro e-mail dal sistema. Ciò interromperà qualsiasi tipo di reclamo del tipo di servizio personalizzato su qualcuno che acceda alla mia email nel tuo sistema ... blah blah blah.

Sì, è necessario presumere che quando fanno clic sul collegamento di verifica vengono verificati. Rendendoli clic su un secondo pulsante in una pagina è un po 'troppo e solo necessario per la registrazione doppio opt-in in cui si prevede di spam la persona che si è registrata. Normalmente gli schemi di registrazione/verifica standard non richiedono questo.

+2

Grazie, Andrew. Ho omesso alcune ipotesi per ridurre la lunghezza del mio post, ma aggiungerò queste informazioni. In generale, i GUID non dovrebbero essere usati come chiavi casuali, in quanto sono progettati per l'unicità e la casualità non sicura. Sono d'accordo che l'azione dell'utente aggiuntivo non dovrebbe essere necessaria, ma eseguire l'azione direttamente sulla richiesta GET non è piacevole da una vista architettonica. Avete riferimenti su "schemi standard di registrazione/verifica"? – Kariem

+0

+1 Per i due suggerimenti sui collegamenti. Non mi piace la verifica automatica su GET, ma piuttosto fornire un secondo fattore di verifica tramite un PIN/UUID aggiuntivo o qualcosa di simile per impedire a robot e altre persone di abilitare accidentalmente gli utenti, per la bassa possibilità che potrebbe essere. – diosney

10

A proposito di reimpostazione della password:

La pratica di fare questo con l'invio di una e-mail all'indirizzo e-mail registrato per l'utente è, mentre molto comune nella pratica, non una buona sicurezza. Ciò esternalizza completamente la sicurezza dell'applicazione al provider di posta elettronica dell'utente. Non importa per quanto tempo le password ti servono e quale astuzia di password intelligente usi. Sarò in grado di entrare nel tuo sito leggendo l'e-mail inviata all'utente, dato che ho accesso all'account e-mail o sono in grado di leggere l'e-mail non crittografata ovunque nel suo percorso verso l'utente (si pensi: amministratori malvagi).

Questo potrebbe o non potrebbe essere importante in base ai requisiti di sicurezza del sito in questione, ma io, come utente del sito, vorrei almeno poter disabilitare tale funzione di reimpostazione della password poiché la considero non sicuro.

ho trovato this white paper che discute l'argomento.

La versione breve di come farlo in modo sicuro:

  1. Richiede dure verità riguardo al conto

    1. nome utente.
    2. indirizzo email. numero di conto
    3. 10 cifre o altre informazioni come il numero di previdenza sociale.
  2. richiedono che l'utente risponde almeno tre domande predefinite (predefinite da te, non lasciare all'utente di creare le proprie domande) che non può essere banale. Come "Che cosa è il tuo luogo di vacanza preferito", non "Qual è il tuo colore preferito".

  3. Opzionalmente: Invia un codice di conferma a un indirizzo di posta elettronica predefinito o il numero di cellulare (SMS) che l'utente deve inserire.

  4. Consenti all'utente di inserire una nuova password.

+1

Non sono sicuro, se ho pienamente compreso la tua risposta, ma credo che manchi il punto: 1) La password non viene mai inviata in nessuna email. Questo non è stato suggerito nella domanda, né in nessuna delle risposte. 2) Ulteriori misure di sicurezza, come numero di conto e domande di verifica non prese in considerazione, poiché si tratta di un argomento diverso. 3) La domanda ha chiesto una soluzione per la reimpostazione della password utilizzando un codice di conferma, che è in realtà una parte della soluzione: elemento 3 nel riepilogo. Potresti per favore approfondire come la tua risposta ti aiuta nel contesto della domanda? – Kariem

+0

1) La domanda originale era "Quali sono le migliori pratiche per i link di attivazione/registrazione/reimpostazione password nelle e-mail con nonce". Nella mia risposta ho cercato di far notare che usare "link di reimpostazione della password nelle e-mail" non è una buona idea. La password non viene mai inviata, ma il link che viene inviato è valido quanto una password poiché dà accesso all'account e consente all'utente malintenzionato di modificare la password dandogli il controllo totale dell'account. 2) Le "misure di sicurezza aggiuntive" erano il mio suggerimento di un modo migliore di fare una reimpostazione della password poiché avevo detto che il reset della posta elettronica era un cattivo modo. –

+0

3) Il processo di invio di un codice di conferma tramite e-mail o SMS sarebbe iniziato solo DOPO che l'altro metodo di identificazione era riuscito. Non dovrebbe essere considerato come l'unico metodo di identificazione richiesto. –