La registrazione dei tentativi di accesso non riusciti espone le password


38

Ho iniziato a registrare tentativi di accesso non riusciti sul mio sito Web con un messaggio simile

Failed login attempt by qntmfred

Ho notato che alcuni di questi registri sembrano

Failed login attempt by qntmfredmypassword

Suppongo che alcune persone non abbiano effettuato l'accesso perché hanno digitato il loro nome utente e la loro password nel campo nome utente. Le password sono sottoposte a hash nel database, ma se in qualche modo il db venisse compromesso, questi messaggi di log potrebbero essere un modo per un attaccante di capire le password per qualunque piccola percentuale di persone finisca per avere un login fallito come questo.

C'è un modo migliore per gestirlo? Dovrei anche preoccuparmi di questa possibilità?


14
Sì, dovresti preoccupartene.
FoolishSeth


4
Domanda interessante poiché attraversa UX e sicurezza. Come notato in uno dei collegamenti di Michael, è possibile prevenire la maggior parte dei casi utilizzando Javascript (lato client). Disabilita il pulsante Accedi mentre il campo password è vuoto. Gli utenti senza Javascript possono comunque utilizzare la schermata di accesso in quel modo, poiché in questo caso il pulsante non verrà disabilitato.
MSalters il

Risposte:


65

Provalo in questo modo:

Se il nome utente esiste, registra "tentativo di accesso fallito entro username". In caso contrario, registra invece "tentativo di accesso fallito tramite IP 123.45.67.89". Ciò dovrebbe risolvere il problema di avere le password visualizzate nel registro per errore.


14
È anche possibile verificare la presenza di una password vuota e fallire con un errore appropriato in quel caso.
Mike Weller,

La stampa del nome utente è il problema descritto dall'OP. A volte un accesso non riuscito è causato dalla mancanza del tasto [tab] da parte dell'utente e dalla digitazione rapida di nome utente e password nel campo nome utente e premendo Invio. Il tuo suggerimento non gestisce questo.
BZink,

7
@BZink: Sì. Se il nome utente esiste , registralo come tale. Se ciò che l'utente fa è aggiungere accidentalmente la password al nome utente, quasi sicuramente la stringa risultante non sarà un nome utente valido.
Mason Wheeler,

12

Perché non controllare semplicemente se tale nome utente esiste nel database? Questo ti lascerà con 2 possibili esiti.

  1. L'utente ha inserito un nome utente corretto. È quindi possibile semplicemente registrare ciò che si registra ora.

  2. L'utente ha inserito la password nel campo nome utente, pertanto il nome utente non è valido. Basta inserire una voce di registro che dice che non è stato eseguito un tentativo di accesso da parte di un utente non identificato?

E ovviamente puoi avere un campo in più per registrare ip, data e cosa no?


3
Perché non aggiungere un hash del nome utente alla voce di registro in # 2. Ciò nasconderà la password, ma allo stesso tempo consentirà a qualcuno che guarda i log di determinare se ci sono più tentativi da parte dello stesso utente non identificato.
emory

Se non esiste un record contenente il nome utente, è ovvio che abbiano sbagliato, quindi è ancora utile per la risoluzione dei problemi.
JeffO,

2
@emory, se l'utente ha inserito erroneamente la propria password insieme al nome utente, non è possibile estrarre solo la parte del nome utente della stringa. E qualcuno che inserisce ripetutamente la propria password nel campo del nome utente è molto improbabile, credo. Questo è un errore "una tantum" che fai. Succede al meglio di noi, ma dubito che ci sia qualcuno abbastanza stupido da continuare a farlo senza accorgersene: D
Galdikas,

@galdikas Non è necessario estrarre nulla dal nome utente. Ad esempio, sono utente "utente" con password "password". Accedo con 'userpassword' e la tua funzione hash mappa 'userpassword' su 17. I registri indicheranno "Tentativo di accesso fallito da parte di un utente non identificato 17".
emory

1
@galdikas Probabilmente non c'è nessuno abbastanza stupido o persistente da continuare a farlo più di qualche volta, ma ci sono script abbastanza stupidi e persistenti da farlo migliaia di volte. Non ti piacerebbe sapere la differenza?
emory

1

considerazioni:

  1. Riesci a rilevare quando ciò si è verificato, al contrario di qualcuno che sta digitando male il suo nome utente? La registrazione di nomi utente errati può essere utile per scopi di supporto, ad esempio rispondere alla domanda "perché non riesco ad accedere" con la risposta "Hai sbagliato a digitare il tuo nome utente, che dovrebbe essere un trattino non un punto" o "Hai i due punti principali poi spazi bianchi - l'hai tagliato e incollato ". Se hai un numero limitato di utenti paganti di alto valore (cioè non ancora un altro sito di social network), probabilmente dovrai fornire questo tipo di supporto.

  2. Qual è l'azione appropriata che qualcuno dovrebbe fare? I nomi utente possono essere indicatori di tentativi di pirateria informatica. Il fatto che il nome utente non compaia nell'elenco non significa che non è necessario sapere di cosa si trattasse. Tuttavia, se ritieni che si tratti di una preoccupazione seria e potresti scoprire di chi era la password, potresti richiedere all'utente di cambiare la password dopo che si è verificato.

  3. Che cos'è la pratica industriale? La pratica del settore consiste nel registrare il campo del nome utente ma non quello della password. È improbabile che tu venga licenziato per questo.

A meno che tu non abbia considerazioni fuori dal comune, ti suggerirei di seguire la pratica del settore e di registrare il campo del nome utente, a prescindere. Considera le modifiche forzate della password come suggerimento 2 se ritieni che ciò sia inadeguato.


1

Per sicurezza, la registrazione nella mia app corrente non memorizza i parametri passati ai metodi di accesso o di reimpostazione della password. La chiamata di registro ha un parametro opzionale che controlla questo, che, se impostato su true, sostituisce l'oggetto parametri memorizzati con [Redacted]. Certo, quindi mi manca un po 'di dati, ma ho i loro indirizzi IP e preferirei non rischiare di ottenere qualcosa di così sensibile in chiaro.

Se vuoi davvero registrare questo tipo di cose, ti suggerirei che quando si registra un tentativo di accesso, controlli il database per gli utenti con un nome corrispondente a quello che hai nel campo del nome utente e lo memorizzi solo se hai una corrispondenza. Altrimenti, lo memorizzi semplicemente come "utente sconosciuto". Potresti essere fantasioso, controllando se questo valore contiene questo o altro, ma c'è sempre il rischio di ottenere combinazioni come [Utente] [Password] e [UserPas] [spada], nel qual caso puoi verificare contro l'IP e dedurlo hai inavvertitamente memorizzato l'inizio della password di qualcuno in chiaro. Potresti estenderlo all'improbabile ma possibile [Utente] [Password] e [UserPassword] [??], nel qual caso puoi vedere "login fallito da UserPassword" seguito da "Login riuscito da Utente" e dedurre tuttodella password dell'utente. In generale, per sicurezza, direi di non registrare nomi utente a meno che l'accesso non abbia esito positivo.

Modifica per aggiungere:

La maggior parte degli argomenti che le persone pubblicano per la registrazione del nome utente per tentativi di accesso non riusciti sono, a mio avviso, gestiti meglio attraverso altri metodi.

Ad esempio, è stato detto che quando un cliente chiede "perché non riesco ad accedere?", I nomi utente registrati ti permetterebbero di segnalare errori di battitura. Questo è vero, ma non vale la pena rischiare di catturare anche le password; Lo farei invece reindirizzando l'utente al modulo di accesso in caso di errore, evidenziando il campo nome utente e ripopolandolo con qualsiasi cosa abbiano digitato in modo che possano vedere da soli.

Un altro argomento è stato che ti consente di identificare i tentativi di hacking; una serie di errori contro un nome utente potrebbe essere un tentativo di forzare una password. Lo farei avendo una colonna "BadLogins" nella tabella Users, che viene incrementata ogni volta che un accesso fallisce con un nome utente corrispondente a questo utente, e viene riportato a zero su un accesso riuscito, dopo aver detto all'utente "ci sono stati x tentativi di accesso falliti dal tuo ultimo accesso "e consigli su cosa fare se non pensano che i tentativi siano stati da loro. Se vuoi essere davvero completo, potresti avere un'altra colonna che memorizza l'ultimo valore della colonna BadLogins anche dopo il login riuscito, e / o una colonna che memorizza il valore più alto di sempre di questa colonna e / o una colonna che memorizza il numero totale di accessi non riusciti che questo account abbia mai avuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.