2013-07-02 18 views
5

Zajmuję się tworzeniem aplikacji internetowej, która wysyła użytkownikowi powiadomienie e-mail, aby ukończyć lekcję/samouczek. Dodałem możliwość automatycznego logowania użytkownika za pomocą linku w tym e-mailu. Ta funkcja została dodana do kilku usług w Internecie, co jest najbardziej godne uwagi, OkCupid.Najlepsze wskazówki dotyczące automatycznego logowania

Oto jak mam skonfigurować tabelę:

+----+-------------+-------------------+-----------+--------------+----------------------+ 
| id | key (22) | secret (40)  | user_id | action  | expires    | 
+----+-------------+-------------------+-----------+--------------+----------------------+ 
| 1 | IbQlQW8Dn...| hdC4dXQJUPA0... | 1  | lesson/14 | 2013-06-21 16:28:55 | 
+----+-------------+-------------------+-----------+--------------+----------------------+ 

Gdy użytkownik odwiedza link poprzez e-mail, coś jak: http://example.com/go/IbQlQW8Dn8PNXJFFwHQxwh/hdC4dXQJUPA0pU7I6eUiXawbnobYv0iThA [http: /example.com/go/ key/secret ]

Najpierw serwer sprawdza, czy adres URL nie wygasł w oparciu o datę w tabeli. Jeśli nie wygasł, użytkownik jest automatycznie logowany za pomocą user_id, a następnie przekierowywany do podanego adresu URL w kolumnie action. Użyłem dwóch oddzielnych wartości (key & secret) dla adresu URL, tylko po to, aby zwiększyć bezpieczeństwo (zapobiec fuskowaniu).

Teraz, ze względu na charakter strony (lekcje wideo), bezpieczeństwo nie jest wielkim problemem, ale nadal chciałbym wiedzieć, jakie najlepsze praktyki należy wziąć pod uwagę.

  • Czy powinienem ograniczyć liczbę przypadków, w których link może zostać użyty?
  • Aktualnie mam łącze wygasające 60 godzin (3 dni) od momentu wysłania wiadomości e-mail . Czy należy to obniżyć?
  • Oczywistym dwoma rodzajami ryzyka nieautoryzowanego dostępu jest to, że ktoś przekazuje wiadomość e-mail lub ktoś uzyskuje dostęp do konta e-mail użytkownika. Coś jeszcze do rozważenia?

Dzięki za każdy wgląd w to, co powinno zostać przeniesione do innej sekcji StackExchange, proszę dać mi znać. Wiem, że widziałem w przeszłości inne najlepsze praktyki.

Odpowiedz

6

Wysyłanie łącza do automatycznego logowania jest dość podobne pod groźbą wysłania linków do resetowania hasła w wiadomościach e-mail, a wiele witryn to robi.

To jest wezwanie do sądu, które musisz wykonać. Nie ma wspólnej matrycy decyzyjnej, którą ludzie wykorzystują do decydowania, co jest i nie jest dopuszczalnym ryzykiem. To, co tu robisz, jest bardziej decyzją biznesową, rozważasz zagrożenia bezpieczeństwa w porównaniu do łatwości użytkowania (co może przekładać się na większą liczbę użytkowników i więcej firm).

Musisz zadać pytanie: "Co jest absolutnie najgorszą rzeczą pod względem dostępności witryny, reputacji biznesowej i doświadczenia użytkownika, które może się zdarzyć, jeśli ta funkcja jest niewłaściwie używana?"..

Dodatkowe rzeczy powinny być zaniepokojony:

  1. Ludzie wyrywanie linki automatycznego logowania na off współdzielonych sieciach WiFi
  2. linków Auto Login kończący się w dziennikach serwerów proxy między serwerem a klient:

Polecam tworzenie linków jednorazowego użytku lub utrzymywanie niskiego czasu wygaśnięcia. Powinieneś również włączyć monitorowanie, które będzie alarmować, jeśli łącze jest nadużywane.

Powinieneś również upewnić się, że nie jesteś podatny na wstrzyknięcia SQL, gdy weźmiesz sekret i przeszukujesz bazę danych.

2

Myślę, że masz wszystkie ważne rzeczy. Zgodziłbym się ze wszystkim @ u2702 powiedział i po prostu dodać ...

  • Może chcesz dać użytkownikom możliwość unieważnienia zaległych linków do logowania lub unieważnienia je automatycznie, gdy zmieniają swój adres e-mail lub hasło.

  • Jeśli witryna wysyła dużo wiadomości e-mail, można pominąć bazę danych i zakodować użytkownika, miejsce docelowe i datę wygaśnięcia w adresie URL wraz z podpisem. Amazon obsługuje to, aby tymczasowo przyznać dostęp do obiektów w S3 (http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html), a inne witryny wykorzystują go do obsługi tokenów CSRF. Pseudokod:

    params = encode_qs(userid=1, target="lesson/14", expires=…) 
    url = "http://example.com/l/?" + params + "&" + 
         encode_qs(sig=hmac_sha1(secret, params)) 
    

    (. Sekret użyć do podpisania wniosku nie musi być unikalna na wiadomości e-mail, ponieważ nie wykazała) To nie jest lepiej niż generowanie kluczy losowych, jak to zrobić, jeśli nie nie zwracaj uwagi na ładunek.

  • Nie sądzę, abyś zyskał cokolwiek, ograniczając liczbę razy, kiedy link może zostać użyty przed wygaśnięciem (OkCupid nie, niektórzy ludzie trzymają się najnowszego e-maila i używają go więcej niż raz).

  • Czy oddzielny "klucz" i "tajny" zapewniają dodatkowe zabezpieczenie, jeśli są zawsze używane razem?

4

ja dość dużo zgadzam się ze wszystkim u2702 powiedział w swojej odpowiedzi, ale należy również nie rozważyć pozwalając użytkownikowi na zmianę hasła bez potwierdzenia ich aktualne hasło, jeśli ich bieżącej sesji została stworzona z dowolnej formie automatycznej rejestracji (cookie , link itp.). Może to przynajmniej uchronić użytkownika przed zablokowaniem konta poprzez zmianę hasła.

Powiązane problemy