Uwierzytelnianie i sesje
Jak użytkownicy udowadniają, kim są, i jak utrzymujesz ich zalogowanych, nie oddając atakującemu kluczy. To najczęściej atakowana powierzchnia każdej aplikacji.
Lista kontrolna
- Haszuj hasła powolnym, solonym algorytmem. Używaj bcrypt, scrypt lub Argon2, nigdy zwykłego SHA ani MD5, i nigdy nie przechowuj hasła jawnym tekstem. Jeśli możesz odczytać hasło użytkownika, to może je odczytać też atakujący mający dostęp do Twojej bazy danych.
- Ogranicz próby logowania i resetu. Ustaw limit prób na adres IP i na konto (na przykład dziesięć na piętnaście minut), a następnie zwracaj 429. Bez tego ataki brute force są trywialne.
- Nie ujawniaj, które adresy e-mail istnieją. Logowanie, rejestracja i reset hasła powinny zwracać tę samą ogólną odpowiedź niezależnie od tego, czy konto istnieje, z jednakowym czasem reakcji i kodami statusu.
- Spraw, by tokeny resetu i weryfikacji były krótkotrwałe i jednorazowe. Godzina lub krócej, unieważniane po użyciu. Traktuj je jak hasła.
- Powiąż przepływ OAuth z przeglądarką, która go rozpoczęła. Jeśli logujesz się przez Google, GitHub lub podobny serwis, zapisz wartość
statew ciasteczku przy żądaniu startowym i porównaj ją przy callbacku. Bez tego powiązania atakujący może wysłać ofierze link, który zaloguje ją na konto atakującego (login-CSRF). Zobacz API i żądania. - Waliduj odpowiedź dostawcy tożsamości. Wymagaj zweryfikowanego e-maila, sprawdzaj odbiorcę (audience) i wystawcę (issuer) tokenu i nigdy nie ufaj identyfikatorowi dostarczonemu przez klienta.
- Jeśli oferujesz uwierzytelnianie wieloskładnikowe (MFA), chroń drugi krok pierwszym. Drugi składnik musi być osiągalny dopiero po pomyślnym sprawdzeniu hasła, z jednorazowym wyzwaniem, inaczej przestrzeń kodów można złamać metodą brute force samodzielnie.
- Wygaszaj sesje i obsługuj ich unieważnianie. Ustaw rozsądny czas życia tokenu i spraw, by zmiana hasła unieważniała wszystkie istniejące sesje.
- Sprawdzaj hasło względem listy wyciekłych haseł (na przykład przez API HIBP z k-anonimowością) przy rejestracji i resecie.
Jak testować
- Wyślij pięćdziesiąt błędnych logowań i potwierdź, że zostajesz ograniczony.
- Porównaj odpowiedź przy resecie dla prawdziwego i fałszywego adresu e-mail. Powinny być identyczne.
- Rozpocznij logowanie OAuth w jednej przeglądarce, a dokończ je w drugiej. Powinno się nie udać.