ProteGO-Safe / backend

GNU General Public License v3.0
71 stars 29 forks source link

Mamy podrasowaną wersję rejestracji #3

Closed jakublipinski closed 4 years ago

jakublipinski commented 4 years ago

Proces rejestracji jest najbardziej newralgicznym elementem naszego systemu. Musimy zabezpieczyć się przed następującymi próbami nadużyć:

Jak osiągnąć powyższe:

Zwracamy aplikacjom za ile czasu mogą ponowić zapytanie.

Kod do tego musi być super klarowny i wszystkie oczy na pokład.

Treści wiadomości: pl: Twój kod dla NAZWA to: 123-456 en: Your NAZWA code is: 123-456

Źródła i inspiracje: https://www.twilio.com/docs/verify/developer-best-practices https://stackoverflow.com/questions/20839638/how-do-you-prevent-verification-code-attack-to-server

Axadiw commented 4 years ago

Widzę, że ten kod smsowy ma myslnik w środku - celowo?

Dopóki nie zrobimy UI to nie wiem jak to zadziała, ale iOS ma wbudowany mechanizm w klawiaturę, który umożliwia automatyczne przepisywanie kodów jednorazowych.

Nie wiem dokładnie jak to działa i czy nie ma tam jakichś obostrzeń, zaznaczam, ze jakbysy chceili z tego skorzystac (a raczej bysmy chcieli, bo wpływa to super na UX) to mozliwe ze będziemy eksperymentowali z formatem tego kodu

jakublipinski commented 4 years ago

@Axadiw dobre. Wydaje się to proste, ale faktycznie może wymagać jakiejś zabawy z treścią SMS (do sprawdzenia). Więcej: https://stackoverflow.com/questions/50791050/ios-12-sms-reading-api

jakublipinski commented 4 years ago

Pseudokod:

Parametry: invalid_regs_per_IP = 10 invalid_regs_per_msisdn = 4

/register(msisdn, IP) returns error lub registration_id

Policz ile pending rejestracji nastąpiło z IP w ciągu ostatniej 1h. Jeśli więcej niż invalid_regs_per_IP zwróć error = "Rejestracja chwilowo niedostępna. Spróbuj za godzinę". (zadanie z gwiazdką: policzyć za ile minut będzie możliwa rejestracja i zwrócić liczbę minut)

Policz ile nieudanych rejestracji nastąpiło na numer msisdn i jeśli więcej niż invalid_regs_per_msisdn zwróć error = "Rejestracja chwilowo niedostępna. Spróbuj za godzinę". (zadanie z gwiazdką: jak wyżej).

Sprawdź czy istnieje Registration na ten sam msisdn rozpoczęte w ciągu ostatnich 10 minut. Jeśli tak weź użyj code z tej rejestracji. Jeśli nie wylosuj code. (Tak, to oznacza, ten sam code może żyć dłużej niż 10 minut).

Zapisz do Registrations IP, msisdn, registration_date, code. Oznacz jako pending.

Sprawdź czy istnieje Registration na ten sam msisdn rozpoczęte w ciągu ostatniej minuty. Jeśli NIE, wyślij SMS.

Zwróć registration_id

/confirm_registration(registration_id, code) returns error lub user_id

Znajdź Registration po registration_id i statusie pending. Jeśli nie ma, zwróć error = Rejestracja niepoprawna. Spróbuj ponownie.

Sprawdź czy Registration.registration_date nie jest starsze niż 10 minut. Jeśli tak, zwróć error = Rejestracja wygasła. Spróbuj ponownie

Sprawdź czy Registration.code == code. Jeśli nie, oznacz Registration jako incorrect i zwróć error = Niepoprawny kod. Spróbuj ponownie.

Oznacz Registration jako completed.

Sprawdź czy jest już User z msisdn == Registration.msisdn. Jeśli tak, zwróć User.user_id.

W przeciwnym wypadku wygeneruj nowego User i zwróć User.user_id.

kstrz commented 4 years ago

Sprawdź czy istnieje Registration na ten sam msisdn rozpoczęte w ciągu ostatniej minuty. Jeśli NIE, wyślij SMS.

Może wysyłać SMS dla tej rejestracji tylko jeśli wysyłka się nie powiodła?

Poza tym wygląda OK.

jakublipinski commented 4 years ago

@kstrz nie wiem czy będziemy wiedzieć o tym, że się nie powiodła. @DariuszAniszewski chyba chciał to robić pub/sub'em

DariuszAniszewski commented 4 years ago

@jakublipinski jest OK - zróbmy to i spróbujmy otestować w miarę możliwości Wysyłka smsa jest robiona osobną funkcją, po triggerze Pub/Sub'em, ale nie widzę problemu, żeby w tej funkcji oznaczyć że wysyłka się udała, a w register sprawdzić

jakublipinski commented 4 years ago

Nie jestem pewien co nam daje informacja o tym, że wysyłka się powiodła lub nie. Jeśli SMSAPI nie działa to i tak niewiele możemy zrobić. Fragment który wskazuje @kstrz zabezpiecza nas przed wysłaniem komuś SMS częściej niż 1/minutę.

DariuszAniszewski commented 4 years ago

Tak, czaję - chciałem się tylko odnieść do tego, że możemy sprawdzić, czy się udało.

Zastanawiam się nad tym co mówisz w kwestii niedziałającego SMSAPI i im dłużej o tym myślę tym bardziej się zgadzam że można to całkowicie pominąć - jak się nie uda, to ktoś spróbuje ponownie po paru minutach. Jeśli nie działa z winy dostawcy, to może już naprawią. A jak się nie uda w ciągu 10 minut, to kody i tak wygasną. 👍

kstrz commented 4 years ago

Bardziej myślałem o tym żeby nie wysyłać wiele razy smsa z tym samym kodem

kstrz commented 4 years ago

Policz ile nieudanych rejestracji nastąpiło na numer msisdn

to znaczy rejestracji ze statusem pending, analogicznie jak w przypadku z ip?

kstrz commented 4 years ago

Rejestracja chwilowo niedostępna. Spróbuj za godzinę

Czy po polslu zwracamy z api? Pozostałem error message mamy po ang.

jakublipinski commented 4 years ago

@kstrz zwracamy błędy w języku lang który przesłał nam użytkownik wraz z żądaniem.

jakublipinski commented 4 years ago

Przerzuciłem pseudokod tutaj: https://github.com/ProteGO-app/backend/blob/master/sms_registration.md Jak chcemy coś zmienić to róbmy PR.