Come posso verificare in sicurezza se esiste un nome utente?

40

Sto lavorando sulla funzionalità di onboarding della mia app Web e ad un certo punto sto chiedendo a un nuovo utente di scegliere un nome utente.

Quando l'utente arriva a questo punto, ho la sua e-mail e un numero di cellulare che è convalidato con un SMS e lui / lei ha passato Google senza CAPTCHA reCAPTCHA.

Devo controllare se il nome utente che si sceglie esiste già e se lo fa, l'utente viene invitato a sceglierne un altro.

Durante la navigazione sul Web, mi sono imbattuto in alcune pagine che dicono che l'implementazione di tale funzionalità fornisce anche a utenti malintenzionati uno strumento per verificare se esiste un nome utente.

Quali sono le migliori pratiche per verificare se esiste un nome utente?

    
posta frenchie 16.05.2016 - 19:30
fonte

10 risposte

39

Questa fonte dice che è quasi impossibile evitare l'enumerazione degli utenti in questa situazione e ritardare un attaccante è il meglio che puoi fare:

If you are a developer you might be wondering how you can protect your site against this kind of attack. Well, although it's virtually impossible to make an account signup facility immune to username enumeration, it is however possible to avoid automated username enumeration attacks against it by implementing a CAPTCHA mechanism.

Tuttavia, potrei aver perso qualcosa - Sono anche curioso di sapere se qualcun altro ha una soluzione migliore.

    
risposta data 16.05.2016 - 19:46
fonte
18

L'alternativa a consentire a più utenti di avere lo stesso nome utente è molto peggio!

In realtà quello che succede con quel sistema

  • L'utente richiede una nuova password
  • Ora devi controllare le password per assicurarti che non si verifichino collisioni
  • L'utente può usarlo per forzare la forza sugli altri account

Questo è male. Quindi è necessario impedire a più utenti di avere lo stesso nome utente. Lo fai controllando.

Che cosa accade se un utente può trovare un nome utente di altri utenti

Questo è lo scenario che ti viene presentato e come impedisci a qualcuno di utilizzarlo maliziosamente. Che rischio ti apri fino a qui?

  • Un utente può trovare un nome utente
  • Ancora non concede l'accesso, poiché ora devono indovinare la password

Va bene, questo offre un po 'più di sicurezza e impedisce agli utenti di avere e-mail e altre informazioni sensibili trapelate. Ma ora vuoi provare a mitigare gli attacchi. Come si fa?

Attenuazione degli attacchi di registrazione

Ci sono un paio di tecniche che esistono qui per prevenirlo, ma il migliore di gran lunga è la limitazione della velocità e i tentativi massimi di accesso tramite IP.

Limitazione della frequenza, Tentativi massimi e Registrazione IP

Quando un utente prova a registrarsi, può solo controllare i nomi utente disponibili così velocemente. In tutta la realtà ci vorrà una persona reale un secondo o due per digitare un nuovo nome utente. Ciò ti consente di eseguire alcuni semplici controlli e saldi . Tuttavia questo accade solo quando cercano di registrarsi. Quando un utente ti attacca e usa un nome utente che non è registrato, tutto ciò che accade è che hanno registrato quel nome utente. Oh bene. Ora devono ricominciare da capo la procedura di registrazione, ed è qui che puoi controllare.

  • L'utente prova a registrare molti account molto velocemente: un bot, fermarli e buttarli fuori (limitazione della velocità)
  • L'utente prova un LOT: Attaccando a mano, buttali fuori (tentativi massimi)
  • L'utente ritorna: lo stesso indirizzo IP mostra un aggressore davvero determinato. BAN IL LORO IP (massimo tentativo ripetuto)

Ora quell'attaccante si è esposto e è stato bandito a livello IP. Sai che sta succedendo qualcosa di brutto qui, avere un registro di nomi utente che potrebbero essere stati luccicati, e ancora non ci sono state perdite di informazioni personali. Ottimo lavoro!

Tuttavia ora è necessario tornare indietro e annullare la registrazione di tutti gli account creati nel tentativo di trovare altri account. Meno male che hai quei log!

The Downfalls Of Usernames Without Emails

Questo è un grande difetto di cui devi essere a conoscenza quando non colleghi un account a un'email: Il nome utente può essere preregistrato e trattenuto per il riscatto . È quindi estremamente difficile dimostrare la proprietà del nome utente. Facciamo in modo che qualcuno faccia un diverso tipo di attacco contro il tuo sistema, dove cerca solo di registrare preventivamente molti account di persone e tenerli in ostaggio. Si spera che tu abbia un registro dai controlli di cui sopra in modo da poter provare a prenderli in flagrante.

Alternative

Hai menzionato che hanno già seguito la procedura di conferma dell'email, quindi un altro modo per gestirlo a questo punto è di collegarlo all'e-mail. Dopo la registrazione, se vogliono cambiare la loro e-mail dovranno effettuare il login e inviare una richiesta con un link alla loro e-mail per cambiarla. Questo può essere fatto con un token sensibile al tempo. Ora possono avere anche un nome utente da visualizzare sul sito. Le insidie sono anche mitigate qui poiché il nome visualizzato può sovrapporsi e non c'è modo di provare ad accedere ad un altro account con quelle informazioni, ma l'email fornisce un controllo di verità (e possibilmente una sorta di identificatore fisico come un'immagine del profilo)

    
risposta data 16.05.2016 - 20:01
fonte
9

Quando un utente prova ad accedere, inserisce il proprio nome utente. Quando ti registri, ti viene detto se un nome utente è preso o meno. Se trovi un nome utente preso, puoi provare ad accedere con esso e possibilmente hackerarlo.

Soluzione che è anche un altro problema:
Se dovessero accedere con un'e-mail, la conoscenza se viene utilizzato un nome utente non sarà di aiuto - si accede con una e-mail e non con il nome utente in modo da non sapere cosa inserire nel modulo di testo e-mail quando si sa che c'è il nome utente helloman . Ma ora il problema è dire all'utente se l'email è stata presa.

Soluzione - al momento della registrazione non dire loro se l'e-mail è stata presa, ma di 'loro che è stata inviata una e-mail di conferma. Invia loro una e-mail, se l'e-mail è stata registrata prima di inviare una e-mail dicendo che qualcuno ha provato a registrare la propria e-mail. Se colui che ha tentato di registrare [email protected] non è il vero inferno di quello che probabilmente non vedrà la posta elettronica di Helloman. E se il vero helloman ha provato a creare un nuovo account con la sua e-mail già registrata, solo lui riceverà una e-mail dicendo che è già registrato. A meno che non ci sia un hacker che è riuscito a hackerare helloman, ma molte persone come helloman non sono stupide e non usano password come password, anche i più comuni sistemi di posta elettronica al giorno d'oggi sono molto sicuri, quindi non c'è da preoccuparsi (e se lui li ha violati piuttosto che non è un nostro problema (se hai impostato il tuo server di posta elettronica per te e il tuo staff)).

    
risposta data 16.05.2016 - 21:45
fonte
3

Consentire a un utente (o a un utente malintenzionato) di scoprire se i nomi utente esistono o meno è noto come vulnerabilità di "enumerazione dei nomi utente". Questo è riassunto bene qui :

As an attacker if I can use your login or forgotten password page to narrow my list from 10000 targets to 1000 targets, I will.

Puoi aggiungere "pagina di registrazione" a quell'elenco. Questo aiuta un aggressore in qualsiasi campagna di phishing o in qualsiasi attacco di induzione di password. È anche un problema di privacy se la moglie di Bob Alice può scoprire se [email protected] esiste su Ashley Madison.com.

Sostanzialmente se permetti agli utenti di scegliere il proprio nome utente separato dalla loro e-mail, quindi per evitare l'enumerazione degli utenti devi consentire l'accesso solo tramite email / password e utilizzare semplicemente il nome utente come mezzo per identificarsi con altri utenti il sito.

In questo modo non c'è alcuna vulnerabilità nel dire Spiacente, nome utente foobar , selezionare un altro .

Questo perché a differenza degli indirizzi email, questi nomi utente non saranno globalmente unici al mondo. Pertanto nessuna violazione della privacy dell'utente viene violato quando si dice che uno è preso. Inoltre, poiché non è possibile accedere utilizzando il nome utente direttamente, ciò non darebbe origine a una vulnerabilità di enumerazione degli utenti.

Come bonus extra, questo rende anche il recupero dell'account e registra un processo più semplice (che fa sempre bene alla sicurezza). Cioè, non c'è bisogno di funzionalità "username dimenticato" e di "password dimenticata" - quando accedono con il loro indirizzo email, che ricorderanno, è l'unica cosa di cui hanno bisogno per recuperare l'accesso presumendo che abbiano ancora accesso ai loro account email. Assicurati di impedire l'enumerazione degli utenti sui tuoi indirizzi email però - consulta questa risposta .

Come aggiornamento di questa risposta, noto che non si desidera utilizzare l'e-mail come nome utente nel caso in cui l'utente decida di modificare il proprio indirizzo e-mail. L'unico motivo per cui posso vedere questo come un problema se nella tua architettura stai usando "username" come chiave primaria, quindi qualsiasi aggiornamento all'indirizzo email (se fosse un nome utente) causerebbe la necessità per ogni tabella collegata di essere aggiornato. La re-architettura di questo per utilizzare PK indipendenti sarebbe la soluzione preferita a questo piuttosto che rendere statico il nome utente. (Ho notato una grande supposizione qui da parte mia sulle tue ragioni per questo.)

    
risposta data 17.05.2016 - 15:20
fonte
1

Ci sono buone risposte da @SilverlightFox e @MaxTheBackspace.

Voglio solo chiarire una cosa: dovrebbe essere non essere possibile per impostazione predefinita in qualsiasi punto dell'applicazione per consentire agli utenti di enumerare un identificatore univoco (probabile) globale come un indirizzo email. Neanche una volta. Non con monitoraggio degli indirizzi IP e limitazione della velocità e un CAPTCHA in linguaggio Klingon creato con il finger paint da un bambino piccolo.

Questo non riguarda solo la sicurezza del tuo servizio ma la privacy dell'utente.

    
risposta data 17.05.2016 - 16:33
fonte
0

Da un punto di vista dell'interfaccia utente / usabilità, se ho già preso 3 passaggi (email, telefono / recaptcha), allora questo riduce la probabilità di un attacco di macchina, e qualsiasi ulteriore roadblock ridurrà il numero di persone che vogliono iscriviti ma rinuncia per frustrazione. Personalmente non mi dispiace affatto se provo a scegliere MarkyMark (No, non sono il rapper), e se qualche altro rapper vuole usare quel nome, preferirei che il sito web dica io che MarkyMark è già in uso (e come altri hanno suggerito, offriamo anche la possibilità di consentire loro di accedere come MarkyMark nel caso in cui ho appena dimenticato di essermi già registrato 3 anni fa), e se il sito suggerisce prova MarkyMark345 o MarkyMarkyMark - questo non significa necessariamente che ci sono MarkyMark1 thru MarkyMark344 già in uso. Apprezzo i suggerimenti. Infatti, una volta un sito suggeriva MarkyMark78 e ho provato MarkyMark77 e è riuscito.

    
risposta data 17.05.2016 - 02:47
fonte
0

L'enumerazione dei nomi utente è una minaccia perché la combinazione di nome utente + password consente a un utente malintenzionato di accedere all'account / al sistema.

Quanto di una minaccia dipende dal tuo sistema. Ad esempio, in un forum in cui il nome utente è comunque associato a ogni post, tale minaccia è molto bassa. Se imponi password complesse, riduce la minaccia.

Nel tuo scenario, a causa di tutti i dati che hai controllato prima di arrivare a quel passo, l'enumerazione sarebbe incredibilmente costosa, quindi smetti di fottere il cervello e vai avanti e digli "nome utente preso", con le alternative offerte come suggerito da Mark Stewart.

    
risposta data 17.05.2016 - 11:15
fonte
0

Potrebbe essere una pratica migliore per il processo di login lavorare con una e-mail e non con un nome utente. Se è necessario avere un nome utente non rendendolo un elemento di autenticazione, un utente malintenzionato non può più utilizzare il controllo di disponibilità del nome utente come strumento dannoso. A questo punto, il nome utente è solo vanità e identità pubblica.

Conosco in un commento hai affermato che volevi che il tuo utente fosse in grado di cambiare la propria e-mail in modo da non volerlo utilizzare per l'accesso. È una pratica assolutamente accettabile fare ciò e consentire la modifica dell'indirizzo email. Lo stesso sito su cui ti trovi fa allo stesso modo.

Quindi ora hai il problema di controllare se qualcuno è già registrato con un indirizzo email. Per i principianti è molto più difficile per qualcuno intuire [email protected] su someguy . E se l'hacker sapeva di someguy sul tuo servizio e voleva attaccarlo in modo specifico, avrebbe dovuto conoscere l'e-mail con cui ha firmato e la sua password contraria a solo una password.

Ma si verificano attacchi automatici e attacchi manuali persistenti. È molto difficile dire se qualcuno abbia provato 50 combinazioni di nomi utente è alla ricerca di informazioni o sta solo cercando di trovare il nome utente perfetto che legittimamente desidera utilizzare. Ma se qualcuno sta cercando di iscriversi usando 5 email diverse, è una bandiera rossa molto più grande per abuso.

Quindi, passando dall'autenticazione all'e-mail tramite il nome utente si ottiene:

  • Nessuna informazione di autenticazione di fronte pubblico
  • Più difficile da indovinare manualmente le informazioni
  • Rilevamento più semplice dell'abuso

La caduta è una potenziale perdita di privacy come menzionato da Lukas nei commenti . Se qualcuno volesse sapere se un determinato utente fosse un membro e sapesse quale e-mail con cui probabilmente iscriversi, potrebbe controllarlo con il tuo sistema di registrazione.

    
risposta data 16.05.2016 - 20:30
fonte
0

Questo non è in generale un problema serio a meno che i tuoi nomi utente siano indirizzi email, il che consentirebbe lo spamming o il dei tuoi utenti. (O anche potenzialmente se fornisci un'API di messaggistica.)

Detto questo , se ritieni che il nome utente sottostante debba essere un segreto: consenti ai nuovi utenti di scegliere un nome visualizzato , ma non consentire loro di scegliere il loro username. sottostante, invece, offri OAuth o aggiungi un numero o una parola casuali al loro nome visualizzato da utilizzare al momento dell'accesso.

E anche in questo caso, se disponi di un'API di messaggistica, la misura di protezione più netta è quella di garantire che i messaggi siano chiaramente contrassegnati con il nome utente di origine.

    
risposta data 19.05.2016 - 00:01
fonte
-4

Bene, la prima cosa che devo dire è quello che dico a chiunque stia facendo domande su nome utente / password: smettila . Utilizza OpenID ed esci dal nome utente / password aziendale.

In secondo luogo, i nomi utente dovrebbero essere considerati come una mitigazione delle collisioni hash, non come sicurezza - cioè, due persone con la stessa password. Da un POV di sicurezza, dovresti considerare il nome utente come uno degli elementi già noti a un utente malintenzionato, non come ulteriore sicurezza.

Quindi, suggerirei di consentire email e possibilmente numeri di telefono e nomi utente per identificare un account in cui non possono o non useranno OpenID (anche se in realtà, dovrei forzarne l'uso impostando il mio interno fornitore come seconda app).

Infine, quando devi prendere un nome utente, limita il numero di sottomissioni. Prendi un minimo di due secondi per restituire la risposta e raddoppiare il tempo per ogni tentativo, richiedi nuovamente l'intero processo se abbandonano la sessione senza selezionare un nome utente.

    
risposta data 17.05.2016 - 17:35
fonte

Leggi altre domande sui tag