Adres URL https z parametrem tokena: czy jest bezpieczny?


89

Na naszej stronie udostępniamy użytkownikom symulację opartą na ich prywatnych informacjach (podanych w formularzu). Chcielibyśmy pozwolić im później wrócić do wyników symulacji, ale bez zmuszania ich do tworzenia konta z loginem / hasłem.

Pomyśleliśmy o wysłaniu im e-maila z linkiem, z którego mogliby uzyskać wyniki. Ale oczywiście musimy zabezpieczyć ten adres URL, ponieważ w grę wchodzą prywatne dane.

Dlatego zamierzamy przekazać token (taki jak 40-znakowa kombinacja liter i cyfr lub skrót MD5) w adresie URL i użyć SSL.

Wreszcie otrzymaliby taki e-mail:

Cześć,
Odzyskaj swoje wyniki na https://www.example.com/load_simulation?token=uZVTLBCWcw33RIhvnbxTKxTxM2rKJ7YJrwyUXhXn

Co o tym myślisz? Czy jest wystarczająco bezpieczny? Co byś mi doradził przy generowaniu tokenów? A co z przekazywaniem parametrów adresu URL w żądaniu https?


Odpowiedzi:


97

SSL będzie chronić parametry zapytania podczas przesyłania; Jednak e-mail sam w sobie nie jest bezpieczny, a e-mail może odbijać się wzdłuż dowolnej liczby serwerów, zanim dotrze do miejsca docelowego.

W zależności od serwera WWW pełny adres URL może zostać zarejestrowany w plikach dziennika. W zależności od wrażliwości danych możesz nie chcieć, aby pracownicy IT mieli dostęp do wszystkich tokenów.

Ponadto adres URL z ciągiem zapytania zostanie zapisany w historii użytkownika, umożliwiając innym użytkownikom tego samego komputera dostęp do adresu URL.

Wreszcie, co sprawia, że ​​jest to bardzo niebezpieczne, adres URL jest wysyłany w nagłówku Referer wszystkich żądań dowolnego zasobu, nawet zasobów stron trzecich. Więc jeśli korzystasz na przykład z Google Analytics, wyślesz Google token adresu URL i wszystkie do nich.

Moim zdaniem to zły pomysł.


1
Nie myślałem o problemie z odniesieniem HTTP, ale link do adresu URL przekierowałby do strony wynikowej, nie byłaby to właściwa strona (bez Google Analytics ani innego skryptu strony trzeciej).
Flackou,

5
Czy większość przeglądarek nie usuwa strony odsyłającej podczas przechodzenia z HTTPS na HTTP?
Kevin Mark

2
Jest to podobne do linku aktywacji użytkownika (lub resetowania hasła), prawda? Jak więc należy postąpić w takim przypadku? Wiele witryn wysyła adresy URL do resetowania na e-mail, POST nie jest opcją, ponieważ powinien być klikalny. Dziękuję Ci.
pinkpanther,

3
więc jakie jest rozwiązanie?
RT

1
a co, jeśli token w adresie URL nie jest tym samym, co token używany do żądań API i trwa tylko godzinę, jaka byłaby wtedy szkoda?
user1709076

13

Użyłbym do tego ciasteczka. Przepływ pracy powinien wyglądać następująco:

  1. Użytkownik odwiedza Twoją witrynę po raz pierwszy.
  2. Witryna ustawia plik cookie
  3. Użytkownik wprowadza dane. Dane są przechowywane w bazie danych za pomocą klucza przechowywanego w pliku cookie.
  4. Kiedy użytkownik odchodzi, wysyłasz mu e-mail z linkiem https:
  5. Kiedy użytkownik wraca, witryna odkrywa plik cookie i może przedstawić użytkownikowi stare dane.

Teraz użytkownik chce użyć innej przeglądarki na innym komputerze. W takim przypadku zaoferuj przycisk „transfer”. Gdy użytkownik kliknie ten przycisk, otrzyma „token”. Może użyć tego tokena na innym komputerze, aby zresetować plik cookie. W ten sposób użytkownik decyduje, w jakim stopniu chce przenieść token.


4

SSL zabezpiecza zawartość przesyłanych danych, ale nie mam pewności co do adresu URL.

Niezależnie od tego, jednym ze sposobów na ograniczenie możliwości ponownego wykorzystania przez atakującego tego tokenu adresu URL jest upewnienie się, że każdego tokenu można użyć tylko raz. Możesz nawet ustawić plik cookie, aby legalny użytkownik mógł nadal korzystać z łącza, ale po pierwszym dostępie będzie on działał tylko dla osoby posiadającej plik cookie.

Jeśli e-mail użytkownika zostanie przejęty, a osoba atakująca otrzyma łącze jako pierwsza, cóż, jesteś w błędzie. Ale użytkownik ma też większe problemy.


11
Połączenie SSL jest zabezpieczane przed przesłaniem adresu URL.
David

1

Poczta e-mail jest z natury niebezpieczna. Jeśli ktoś może kliknąć to łącze i uzyskać dostęp do danych, tak naprawdę ich nie chronisz.


Dokładnie, ale wiele witryn nie przejmuje się tym i wysyła login / hasła pocztą. Ale to nie jest powód, żeby ich naśladować ...
Flackou

Nie zgadzam się na to, by ich naśladować, ale zwykle każą ci zmienić hasło po pierwszym zalogowaniu.
Jason Punyon

1

Cóż, token jest bezpieczny podczas przesyłania przez SSL. Problem, który będziesz mieć, polega na tym, że jest on dostępny dla ludzi (tych, dla których nie jest przeznaczony), dzięki możliwości przeglądania adresu URL.

Jeśli są to informacje prywatne, takie jak SSN, nie sądzę, żebym wysyłał adres URL pocztą e-mail. Wolałbym, żeby utworzyli nazwę użytkownika i hasło do witryny. Zbyt łatwo jest sfałszować wiadomość e-mail zawierającą takie informacje dla Ciebie i dla nich. Jeśli czyjeś konto jest sfałszowane, pojawi się pytanie, czyja to naprawdę wina. Im bezpieczniejszy, tym lepszy jesteś ze ścisłego punktu widzenia CYA.


1
Masz rację: adres URL pozostałby na przykład w historii przeglądarki
Flackou

0

Naprawdę nie uważałbym tego za wystarczająco bezpieczne w sytuacji, w której występują poważne problemy z prywatnością. Fakt, że wysyłasz adres URL w wiadomości e-mail (prawdopodobnie w postaci zwykłego tekstu), jest zdecydowanie najsłabszym łączem. Następnie pojawia się ryzyko ataków siłowych na tokeny, które (bez struktury prawdziwego mechanizmu uwierzytelniania) mogą być bardziej podatne na ataki niż dobrze skonstruowana nazwa użytkownika i konfiguracja hasła.

Nawiasem mówiąc, nie ma żadnych problemów z parametrami w żądaniu https.


Masz rację co do ryzyka ataków siłowych. Nie wiem, jak moglibyśmy zapobiec tego typu atakom botów. Zakaz „nalegania” na adresy IP nie byłby wystarczającą ochroną. Czy masz jakieś pomysły na ten temat?
Flackou,

Właściwie, z rodzajem przestrzeni klucza, o której mówimy, wstawienie if (this_ip_number_has_requested_an_invalid_token_today ()) sleep (5); w twoim skrypcie load_simulation byłaby całkowicie wystarczająca ochrona. (Ograniczanie szybkości jest jedną z tych cech dobrych mechanizmów uwierzytelniania.)
chaos

Dzięki za odpowiedź. Ale pomyślałem, że ten sam bot może z łatwością przyjmować różne adresy IP, przez co limit szybkości IP nie jest wystarczający. Czy się mylę?
Flackou

Wszystko, co je dostaje, to jedna nieopóźniona próba na adres IP. Przestrzeń adresów IP nie jest tak łatwo dostępna, aby była pomocna.
chaos

0

W obecnej sytuacji byłby to zły pomysł. Łatwe użytkowanie zwiększy bezpieczeństwo. Jak powiedziano wcześniej, SSL będzie chronić tylko przesyłanie informacji między serwerem a przeglądarką klienta i zapobiegnie tylko atakowi pośrednika. E-maile są bardzo ryzykowne i niepewne.

Najlepszym rozwiązaniem byłoby uwierzytelnienie nazwy użytkownika i hasła w celu uzyskania dostępu do informacji.

Mniej więcej podoba mi się pomysł na ciasteczka. Powinieneś również zaszyfrować informacje o plikach cookie. Powinieneś także wygenerować token z solą i frazą kluczową oraz $ _SERVER ['HTTP_USER_AGENT'], aby ograniczyć prawdopodobieństwo ataku. Przechowuj jak najwięcej niewrażliwych informacji o kliencie w pliku cookie w celu weryfikacji.

Frazę kluczową można zapisać w pliku cookie w celu łatwego użycia, ale należy pamiętać, że również plik cookie może zostać skradziony = (.

Lepiej pozwól klientowi wpisać podaną przez siebie frazę kluczową, która jest również przechowywana w bazie danych wraz z jego danymi.

Lub klucza można użyć w przypadku, gdy osoba korzysta z innej maszyny, która różni się parametrami $ _SERVER ['HTTP_USER_AGENT'] lub po prostu nie ma pliku cookie. Tak więc plik cookie można przenieść lub ustawić.

Upewnij się również, że poufne dane są zaszyfrowane w bazie danych. Nigdy nie wiesz ;)


-1

Czy zdajesz sobie sprawę, że jeśli jakikolwiek haker uzyska dostęp do Twojej bazy danych, możesz swobodnie przekazać wiele osobistych informacji?

Potem powiedziałbym, że to nie jest zły pomysł. Nie użyłbym MD5 ani SHA1, ponieważ nie są one zbyt bezpieczne do mieszania. Można je dość łatwo „odszyfrować” (wiem, że to nie jest szyfrowanie).

W przeciwnym razie może użyłbym drugiej informacji, która nie byłaby przesłana e-mailem jako hasło. Powód jest dość prosty, jeśli ktoś uzyska dostęp do poczty elektronicznej użytkownika (całkiem łatwe w przypadku hotmaila, jeśli nie zabijesz sesji), będzie miał dostęp do wszelkich informacji, które wysłał użytkownik.

Pamiętaj, że HTTPS zabezpiecza i szyfruje dane wysyłane z Twojej witryny do użytkownika końcowego. Nic więcej, potraktuj to jako bezpieczny tunel. Nic więcej ani mniej.


Jak dokładnie jest odszyfrowywany zasolony hash SHA1 w jakimkolwiek znaczeniu tego słowa?
Eli

„Czy zdajesz sobie sprawę, że jeśli jakikolwiek haker uzyska dostęp do Twojej bazy danych, będzie mógł swobodnie podać wiele osobistych informacji?” Tak, ale czy nie stanowi to problemu dla wszystkich witryn internetowych?
Flackou

@Flackou tak, ale jeśli uzyskasz dostęp do bazy danych PayPal, nie znajdziesz wyraźnie zapisanych informacji o karcie kredytowej, wszystko jest zaszyfrowane. @Eli: theregister.co.uk/2005/02/17/sha1_hashing_broken
Erick

-1

Z tego, co rozumiem o twoim pomyśle, teoretycznie ktoś mógłby wpisać losowy ciąg 40 znaków lub skrót MD5 i uzyskać informacje o kimś innym. Chociaż może to być mało prawdopodobne, wystarczy, że zdarzy się to tylko raz.

Lepszym rozwiązaniem może być wysłanie użytkownikowi tokena, a następnie poproszenie go o wprowadzenie niektórych szczegółów, takich jak imię i nazwisko, kod pocztowy, ssn lub ich kombinacja.


5
PESEL? Mówisz poważnie? W każdym razie proponuję obliczyć liczbę 40-znakowych losowych ciągów. To więcej niż tylko „mało prawdopodobne”
Eli

Masz rację, prawdopodobnie powinniśmy dodać kolejny parametr do adresu URL, na przykład e-mail (nawet jeśli a..z + A..Z + 0..9 = 62 znaki, a 62 ^ 40 to całkiem duża liczba).
Flackou,

Chłopaki, 62 ^ 40 to znacznie więcej niż liczba atomów we wszechświecie. To jest dosłownie nie do odgadnięcia.
Eli

1
Dziwię się, jak wiele osób nie może pojąć skali tych liczb. Jeśli zgadujesz MILIONA żetonów na sekundę, jest znacznie bardziej prawdopodobne, że słońce wypaliłoby się, zanim dostaniesz trafienie
Eli

4
Richard, wygląda na to, że wskazujesz na coś, co zwykle nazywa się Paradoksem Urodzinowym ... liczy się nie tylko liczba możliwych kombinacji, ale to, ile z nich jest używanych. W tym przypadku musisz użyć około 2 ^ 119 z 62 ^ 40 kombinacji, zanim szansa stanie się znacząca.
erickson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.