Bei fehlgeschlagenen Anmeldeversuchen werden Kennwörter angezeigt

38

Ich habe damit begonnen, fehlgeschlagene Anmeldeversuche auf meiner Website mit einer Nachricht wie der folgenden zu protokollieren

Failed login attempt by qntmfred

Ich habe bemerkt, dass einige dieser Protokolle aussehen

Failed login attempt by qntmfredmypassword

Ich vermute, einige Leute hatten eine fehlgeschlagene Anmeldung, weil sie ihren Benutzernamen und ihr Passwort in das Feld Benutzername eingegeben haben. Passwörter sind in der Datenbank gehasht, aber wenn die Datenbank irgendwie kompromittiert wurde, können diese Protokollnachrichten eine Möglichkeit für einen Angreifer sein, Passwörter für einen beliebigen kleinen Prozentsatz von Personen zu ermitteln, bei denen eine Anmeldung wie diese fehlgeschlagen ist.

Gibt es eine bessere Möglichkeit, damit umzugehen? Sollte ich mir überhaupt Gedanken über diese Möglichkeit machen?

Kenwarner
quelle
14
Ja, du solltest dir darüber Sorgen machen.
FoolishSeth
4
Interessante Frage, da es UX und Sicherheit kreuzt. Wie in einem von Michaels Links erwähnt, können Sie in den meisten Fällen die Verwendung von Javascript (clientseitig) verhindern. Deaktivieren Sie die Anmeldeschaltfläche, während das Kennwortfeld leer ist. Benutzer ohne Javascript können den Anmeldebildschirm weiterhin auf diese Weise verwenden, da die Schaltfläche in diesem Fall nicht deaktiviert wird.
MSalters

Antworten:

65

Versuchen Sie es wie folgt:

Wenn der Benutzername existiert, melden Sie "fehlgeschlagener Anmeldeversuch von username". Wenn nicht, melden Sie sich 123.45.67.89stattdessen mit "Fehlgeschlagener Anmeldeversuch von IP " an. Damit sollte das Problem behoben sein, dass Passwörter versehentlich im Protokoll angezeigt werden.

Mason Wheeler
quelle
14
Sie können auch nach einem leeren Kennwort suchen und in diesem Fall einen entsprechenden Fehler feststellen.
Mike Weller
Das Drucken des Benutzernamens ist das vom OP beschriebene Problem. Manchmal wird eine fehlgeschlagene Anmeldung dadurch verursacht, dass der Benutzer die [Tab] -Taste fehlt und schnell sowohl den Benutzernamen als auch das Kennwort in das Feld Benutzername eingibt und die Eingabetaste drückt. Ihr Vorschlag geht damit nicht um.
BZink
7
@BZink: Ja, das tut es. Wenn der Benutzername existiert , melden Sie ihn als solchen an. Wenn der Benutzer versehentlich das Kennwort zum Benutzernamen hinzufügt, ist die resultierende Zeichenfolge mit ziemlicher Sicherheit auch kein gültiger Benutzername.
Mason Wheeler
12

Warum nicht einfach prüfen, ob ein solcher Benutzername in der Datenbank vorhanden ist? Dies lässt Sie mit 2 möglichen Ergebnissen zurück.

  1. Der Benutzer hat einen korrekten Benutzernamen eingegeben. Sie können dann einfach protokollieren, was Sie jetzt protokollieren.

  2. Der Benutzer hat sein Passwort in das Feld Benutzername eingegeben. Daher ist der Benutzername ungültig. Geben Sie einfach einen Protokolleintrag ein, der besagt, dass der Anmeldeversuch eines nicht identifizierten Benutzers fehlgeschlagen ist.

Und natürlich können Sie ein zusätzliches Feld haben, um IP, Datum und was nicht zu protokollieren?

galdikas
quelle
3
Warum nicht einen Hash des Benutzernamens an den Protokolleintrag in # 2 anhängen. Dadurch wird das Kennwort ausgeblendet, aber gleichzeitig kann eine Person, die sich die Protokolle ansieht, feststellen, ob derselbe nicht identifizierte Benutzer mehrere Versuche unternimmt.
Emory
Wenn es keinen Datensatz gibt, der den Benutzernamen enthält, liegt es auf der Hand, dass er falsch ist. Dies ist also immer noch hilfreich, um Probleme zu beheben.
JeffO
2
@emory, wenn der Benutzer versehentlich sein Passwort zusammen mit dem Benutzernamen eingibt, gibt es keine Möglichkeit, nur den Benutzernamen-Teil der Zeichenfolge zu extrahieren. Und jemand, der wiederholt sein Passwort in das Feld Benutzername eingibt, ist meiner Meinung nach sehr unwahrscheinlich. Dies ist ein "einmaliger" Fehler, den Sie machen. Passiert zu den Besten von uns, aber ich bezweifle, dass es jemanden gibt, der dumm genug ist, es zu tun, ohne es zu merken: D
galdikas
@galdikas Es ist nicht erforderlich, etwas aus dem Benutzernamen zu extrahieren. Zum Beispiel bin ich Benutzer 'Benutzer' mit Passwort 'Passwort'. Ich melde mich mit 'userpassword' an und Ihre Hash-Funktion ordnet 'userpassword' 17 zu. In den Protokollen wird "Fehlgeschlagener Anmeldeversuch von nicht identifiziertem Benutzer 17" angezeigt.
Emory
1
@galdikas Es gibt wahrscheinlich niemanden, der dumm oder ausdauernd genug ist, um es öfter als ein paar Mal zu tun, aber es gibt Skripte, die dumm und ausdauernd genug sind, um es tausende Male zu tun. Möchten Sie den Unterschied nicht wissen?
Emory
1

Überlegungen:

  1. Können Sie feststellen, wann dies passiert ist, anstatt dass jemand seinen Benutzernamen falsch eingibt? Die Protokollierung von Benutzernamen mit falscher Schreibweise kann für Supportzwecke nützlich sein, z. B. wenn Sie die Frage "Warum kann ich mich nicht anmelden?" Mit der Antwort "Sie haben Ihren Benutzernamen falsch eingegeben, der Bindestrich sollte kein Punkt sein" oder "Sie haben einen vorangestellten Doppelpunkt dann Leerzeichen - hast du es ausgeschnitten und eingefügt ". Wenn Sie eine kleine Anzahl von hochbezahlten Benutzern haben (dh noch keine andere Social Networking-Site), müssen Sie wahrscheinlich diese Art von Support bereitstellen.

  2. Was ist die geeignete Maßnahme, wenn jemand dies tut? Benutzernamen können ein Hinweis auf Hacking-Versuche sein. Die Tatsache, dass der Benutzername nicht in Ihrer Liste erscheint, bedeutet nicht, dass Sie nicht wissen müssen, was er war. Wenn Sie jedoch der Meinung sind, dass dies ein ernstes Problem ist und Sie feststellen können, wessen Passwort es war, können Sie den Benutzer dazu auffordern, sein Passwort zu ändern, nachdem dies geschehen ist.

  3. Was ist Industriepraxis? In der Industrie ist es üblich, das Feld Benutzername, nicht jedoch das Feld Kennwort zu protokollieren. Es ist unwahrscheinlich, dass Sie dafür entlassen werden.

Sofern Sie keine ungewöhnlichen Überlegungen anstellen, würde ich empfehlen, die Branchenpraxis zu befolgen und das Feld für den Benutzernamen unabhängig davon zu protokollieren. Ziehen Sie erzwungene Kennwortänderungen als Vorschlag 2 in Betracht, wenn Sie dies für unzureichend halten.

Ben
quelle
1

Aus Sicherheitsgründen werden beim Anmelden in meiner aktuellen App keine Parameter gespeichert, die an Anmeldemethoden oder Methoden zum Zurücksetzen des Kennworts übergeben wurden. Der Protokollaufruf verfügt über einen optionalen Parameter, der dies steuert. Wenn dieser Parameter auf true gesetzt ist, wird das gespeicherte Parameterobjekt durch ersetzt [Redacted]. Klar, ich verpasse ein wenig Daten, aber ich habe ihre IP-Adressen und möchte lieber nicht riskieren, etwas so sensibles im Klartext zu bekommen.

Wenn Sie wirklich so etwas protokollieren möchten, würde ich vorschlagen, dass Sie beim Protokollieren eines Anmeldeversuchs die Datenbank auf Benutzer mit einem Namen überprüfen, der mit dem im Feld Benutzername übereinstimmt, und ihn nur speichern, wenn Sie eine Übereinstimmung haben. Andernfalls speichern Sie es einfach als "unbekannter Benutzer". Sie könnten sich vorstellen, zu prüfen, ob dieser Wert das oder was auch immer enthält, aber es besteht immer das Risiko, dass Sie Kombinationen wie [User] [Password] und [UserPas] [sword] erhalten. In diesem Fall können Sie anhand der IP prüfen und daraus ableiten Sie haben versehentlich den Anfang des Passworts einer anderen Person im Klartext gespeichert. Sie können dies auf das unwahrscheinliche aber mögliche [User] [Password] und [UserPassword] [??] ausweiten. In diesem Fall wird "Fehlgeschlagene Anmeldung mit UserPassword" angezeigt, gefolgt von "Erfolgreiche Anmeldung mit User", und Sie können alle ableitendes Benutzerpassworts. Im Allgemeinen würde ich sicherheitshalber sagen, dass Benutzernamen nur dann protokolliert werden, wenn die Anmeldung erfolgreich ist.

Zum Hinzufügen bearbeiten:

Die meisten Argumente, die Leute für die Protokollierung des Benutzernamens für fehlgeschlagene Anmeldeversuche vorbringen, lassen sich meiner Meinung nach besser mit anderen Methoden behandeln.

Zum Beispiel wurde gesagt, dass wenn ein Kunde fragt, warum ich mich nicht anmelden kann, protokollierte Benutzernamen es Ihnen ermöglichen würden, Tippfehler anzuzeigen. Dies ist wahr, aber das Risiko, auch Passwörter zu fangen, ist es nicht wert. Ich würde dies tun, indem ich den Benutzer bei einem Fehler zurück zum Anmeldeformular leite, das Feld "Benutzername" hervorhebe und es mit den eingegebenen Daten erneut ausfülle, damit sie es selbst sehen können.

Ein weiteres Argument war, dass Sie damit Hacking-Versuche identifizieren können. Eine Reihe von Fehlern gegen einen Benutzernamen kann durchaus ein Versuch sein, ein Passwort zu erzwingen. Zu diesem Zweck wird in der Tabelle "Users" eine Spalte "BadLogins" angezeigt, die jedes Mal erhöht wird, wenn eine Anmeldung mit einem Benutzernamen fehlschlägt, der diesem Benutzer entspricht, und bei erfolgreicher Anmeldung auf Null zurückgesetzt wird, nachdem dem Benutzer mitgeteilt wurde, dass dies der Fall war x erfolglose Anmeldeversuche seit Ihrem letzten Login "und Ratschläge, was zu tun ist, wenn sie nicht glauben, dass die Versuche von ihnen stammen. Wenn Sie wirklich gründlich sein möchten, können Sie eine weitere Spalte haben, in der der letzte Wert der BadLogins-Spalte auch nach der erfolgreichen Anmeldung gespeichert ist, und / oder eine Spalte, in der der bisher höchste Wert dieser Spalte gespeichert ist, und / oder eine Spalte, in der dieser Wert gespeichert ist Speichert die Gesamtzahl der fehlgeschlagenen Anmeldungen, die dieses Konto jemals hatte.

Anaximander
quelle