Authentifizierung und Sitzungen
Wie Benutzer ihre Identität nachweisen und wie Sie sie angemeldet halten, ohne einem Angreifer die Schlüssel zu übergeben. Dies ist die am häufigsten angegriffene Oberfläche jeder App.
Checkliste
- Passwörter mit einem langsamen, gesalzenen Verfahren hashen. Verwenden Sie bcrypt, scrypt oder Argon2, niemals einfaches SHA oder MD5, und speichern Sie nie Klartext. Wenn Sie das Passwort eines Benutzers lesen können, kann ein Angreifer mit Zugriff auf Ihre Datenbank dasselbe.
- Login und Zurücksetzen drosseln. Begrenzen Sie Versuche pro IP und pro Konto (zum Beispiel zehn pro fünfzehn Minuten) und antworten Sie dann mit 429. Ohne das ist Brute-Force trivial.
- Nicht preisgeben, welche E-Mail-Adressen existieren. Login, Registrierung und Passwort-Zurücksetzung sollten dieselbe allgemeine Antwort liefern, unabhängig davon, ob das Konto existiert, mit konsistentem Timing und konsistenten Statuscodes.
- Zurücksetzungs- und Verifizierungs-Tokens kurzlebig und einmalig machen. Eine Stunde oder weniger, nach der Verwendung ungültig. Behandeln Sie sie wie Passwörter.
- Den OAuth-Ablauf an den Browser binden, der ihn gestartet hat. Wenn Sie sich mit Google, GitHub oder ähnlichen Diensten anmelden, speichern Sie bei der Startanfrage einen
state-Wert in einem Cookie und vergleichen Sie ihn beim Callback. Ohne diese Bindung kann ein Angreifer dem Opfer einen Link schicken, der das Opfer in das Konto des Angreifers einloggt (Login-CSRF). Siehe APIs und Anfragen. - Die Antwort des Identity Providers validieren. Verlangen Sie eine verifizierte E-Mail-Adresse, prüfen Sie Audience und Issuer des Tokens und vertrauen Sie nie einer ID, die der Client liefert.
- Wenn Sie Multi-Faktor-Authentifizierung anbieten, hängt Schritt zwei von Schritt eins ab. Der zweite Faktor darf erst nach bestandener Passwortprüfung erreichbar sein und sollte eine einmalige Challenge verwenden. Sonst lässt sich der Coderaum allein per Brute-Force durchprobieren.
- Sitzungen ablaufen lassen und Widerruf unterstützen. Setzen Sie eine sinnvolle Lebensdauer für Tokens und sorgen Sie dafür, dass eine Passwortänderung alle bestehenden Sitzungen ungültig macht.
- Ihr Login gegen eine Liste kompromittierter Passwörter prüfen (zum Beispiel über die k-Anonymitäts-API von HIBP) bei Registrierung und Zurücksetzung.
Testvorgehen
- Skripten Sie fünfzig fehlgeschlagene Logins und bestätigen Sie, dass Sie gedrosselt werden.
- Vergleichen Sie beim Zurücksetzen die Antwort auf eine echte und eine erfundene E-Mail-Adresse. Sie sollten identisch sein.
- Starten Sie einen OAuth-Login in einem Browser und schließen Sie ihn in einem anderen ab. Er sollte fehlschlagen.