Cześć, napisałem w Node.js - Express.js proste API do tworzenia konta, zmiany hasla oraz logowania, najbardziej gryzie mnie czy poprawnie napisałem logikę tych rzeczy a nie sam kod.
Do potwierdzenia emailu użytkownika używam krótkiego kodu (8 dużych alfa numerycznych znaków) np. 4K2Y V1F0 wysyłanego na email
Proces tworzenia konta:
- Użytkownik wpisuje email i zostaje na niego wysłany kod do potwierdzenia (wygenerowanie kodu)
- Użytkownik musi wpisać otrzymany kod i potwierdzić (aktywowanie kodu i utworzenie konta bez hasła)
- Użytkownik musi wpisać dwukrotnie nowe hasło (przypisuje się do wcześniej utworzonego konta)
po stworzeniu konta, poprzez weryfikację kodu i wpisanie hasła, wysyłane są do każdego requestu takie dane jak:
- token urządzenia = losowy id dla urządzenia dla potwierdzenia że wszystkie czynności są z tego samego urządzenia
- adres IP = dla potwierdzenia wiarygodności użytkownika (pomijając fakt że jednego adresu może używać wiele osob)
- email = główny parametr wobec którego jest cały proces tworzenia konta.
- kod = wysylany do drugiego i trzeciego kroku, hasło zostanie utworzone/zmienione jeśli wszystkie 4 parametry się zgadzają a sam kod jest aktywowany
Kod od utworzenia istnieje 8 minut, po tym czasie już nie jest aktywny,
w ciągu doby jeden adres IP może wysłać max 30 nowych kodów na email.
I teraz punkt który mnie najbardziej martwi, dowolny kod można potwierdzić max 15 razy na godzinę z jednego adresu ip, w przypadku gdy ktoś w jakikolwiek sposób będzie używać adresu innej osoby (np. ta sama sieć, komuś przypisze adres z wykorzystanymi próbami) to w tym momencie jeśli jedna osoba zużyje limit, to druga nie może ustawić nowego hasła przy zmianie bo nie może potwierdzić kodu, zdjęcie limitu 15 potwierdzeń na godzinę pozwoli na mnóstwo prób w odgadnięciu kodu np. atakującemu, więc nie za bardzo wiem czy tutaj limit na ilośc potwierdzeń kodu w ogóle jest sens ustawiać.
przedstawiłem proces rejestracji, ale zmiany hasła wygląda praktycznie podobnie, prosiłbym o ocenę i opinie, nie chce zbytnio przesadzać z bezpieczeństwem, ale też nie chce zostawić luk pozwalających przejąć kogoś konto