Modifica per rispondere alla domanda effettiva
Ci scusiamo per aver frainteso la tua domanda. Detto questo, ecco una risposta. Se il tuo obiettivo è fare in modo che nessuno sappia quali indirizzi email hai registrato sul sistema (che è un buon obiettivo), allora la semplice risposta è che non puoi verificare prima della mano se l'indirizzo e-mail è preso, e poi fagli sapere se è così. Indipendentemente da quali misure di sicurezza hai messo in atto, avrai comunque un posto dove le persone possono venire a chiedere "questa persona è sul tuo sito?". Anche la limitazione della frequenza non lo fa in realtà, poiché un malintenzionato potrebbe bersagliare un utente specifico. Se già conoscono l'indirizzo e-mail della persona in anticipo, devono solo andare al modulo di registrazione e vedere se l'e-mail è stata presa. Invece, dovrai modificare il tuo passo di registrazione:
- Puoi sempre verificare che si tratti di un vero e proprio indirizzo email (dicendogli che l'indirizzo email non è un indirizzo email proteggerà dagli errori di battitura e ovviamente non rivelerà nulla di sensibile).
- Fagli digitare due volte l'indirizzo email: questo, di nuovo, aiuterà a prevenire errori di battitura, che saranno di grande aiuto nel passaggio successivo:
- Forza l'utente attraverso un processo di convalida della posta elettronica, come descritto di seguito: invia loro un'email con una chiave che deve utilizzare per attivare il proprio account. Questo fornisce un paio di livelli di protezione. Se qualcuno sta usando il modulo di registrazione per annusare gli indirizzi email usati, non scoprirà nulla. In tutti i casi il modulo di registrazione restituisce un messaggio generico "Controlla la tua email per le istruzioni su come attivare il tuo account". Se l'indirizzo e-mail esiste già, anziché inviare le istruzioni di attivazione, puoi inviare un messaggio "Hai appena provato a registrarti ma già esiste nel nostro sistema. Fai clic qui per recuperare la password." Se non hai provato a registrarti, fai clic su questo link e quindi ignorare questo messaggio "(o qualcosa del genere). Altrimenti, esegui il normale messaggio di convalida della posta elettronica.
Dato che non vuoi dire alle persone se tentano di registrarsi con una email già esistente, riceverai tre persone diverse che invieranno il modulo di registrazione:
- Nuove persone che stanno cercando di registrarsi (queste persone non avranno alcun problema)
- Gli anziani che sono già registrati ma dimenticati: la tua e-mail alternativa li aiuterà a entrare molto rapidamente.
- Le persone che stanno cercando di raschiare la tua lista e-mail. Non riceveranno nulla.
Di conseguenza, gli attori malintenzionati verranno esclusi e i tuoi utenti legittimi passeranno senza problemi. Un buon mix tra usabilità e sicurezza (IMO).
risposta precedente: leggermente applicabile
Una corretta convalida della posta elettronica non dovrebbe comportare la possibilità per qualcuno di verificare l'esistenza di indirizzi e-mail nel sistema. Potrebbe essere necessario includere maggiori dettagli su cosa esattamente stai facendo. Detto questo, vale sempre la pena spiegare quale sia la risposta dovrebbe essere:
La convalida della posta elettronica deve essere eseguita da una chiave crittografica sicura e casuale che viene inviata via email all'utente. A quel punto la convalida del tempo può essere semplice come fare clic su un link che si invia all'utente che assomiglia a qualcosa di simile:
https://example.com/verify_registration?key=LONGANDRANDOMSTRING
Cose da tenere a mente:
- Assicurati che la chiave di convalida sia generata con un CSPRNG corretto: se l'utente può indovinare la chiave dal loro input, è inutile.
- L'indirizzo email dell'utente non fa parte dell'input e non è necessario in nessuna fase del processo di convalida. Il fatto che l'utente conosca la chiave casuale, che viene distribuita solo via email, è ciò che verifica che l'utente possieda l'indirizzo email. Di conseguenza, non dovrebbero esserci opportunità per le persone di analizzare un elenco di indirizzi e-mail.
- Assicurati che la tua chiave abbia abbastanza byte casuali da non poter essere indovinata
- Normalmente utilizzeresti solo
POST
di richieste per apportare modifiche e, pertanto, desideri assicurarti che questo endpoint abbia una protezione CSRF. Tuttavia, non è necessario qui. Il motivo è che la chiave stessa è sufficientemente casuale che nessuno, tranne la persona con l'e-mail, dovrebbe averlo comunque. Quindi è meglio che il processo di validazione avvenga tramite un semplice link e una richiesta di GET
. Anche se l'utente deve semplicemente copiare e incollare la chiave dalla propria email a un modulo Web, qualcuno lo sbaglia. Il modo in cui funziona è abbastanza semplice e abbastanza sicuro che (IMO) un'interfaccia utente più semplice è perfettamente ragionevole.
- Vale la pena menzionare perché lo vedo sempre: gli hash non aggiungono casualità a una stringa. Utilizzare un CSPRNG effettivo per creare una stringa casuale. Non prendere semplicemente dei dati altrimenti semplici e cancellarli. Gli hash non aggiungono entropia: devono farlo apparire casuali.