2011-08-27 21 views
18

Mam na sobie wiele starych pytań na temat tego argumentu i myślę, że uważam, że najlepszą praktyką jest utworzenie pliku cookie z username, user_id i losowym tokenem.Zapamiętaj mnie Cookie best practice?

Te same dane cookie są przechowywane w DB przy tworzeniu plików cookie, a gdy użytkownicy mają plik cookie, są porównywane (dane cookie, dane DB).

Pozdrawiam, że nie mogę zrozumieć, gdzie jest logika bezpieczeństwa, jeśli jest to najlepsza praktyka.

Osoba atakująca, która kradnie plik cookie, ma to samo ciasteczko, co oryginalny użytkownik: |

Zapomniałeś jakiegoś kroku? : P

+0

Nie jestem w 100% pewien, co do stanu rzeczy w PHP do tej pory, ale zazwyczaj najlepszą praktyką jest korzystanie z istniejącego dobrze przyjętego systemu, a nie z własnej. –

+0

Używam framework Codeigniter – sbaaaang

+0

Czy codeigniter ma moduł uwierzytelniania? Edytuj - Wygląda tak: http://stackoverflow.com/questions/346980/what-codeigniter-authentication-library-is-best –

Odpowiedz

18

Powinieneś przechowywać numer user_id i dodatkowo losować token jako hasło użytkownika. Użyj tokena w pliku cookie i zmień token po zmianie hasła. W ten sposób, jeśli użytkownik zmieni swoje hasło, plik cookie zostanie unieważniony.

Jest to ważne, jeśli plik cookie został przejęty. Zostanie ono unieważnione, jeśli użytkownik wykryje porwanie, a ponadto, ponieważ token nie ma związku z hasłem, którego porywacz nie będzie mógł uzyskać, a następnie zmieni hasło konta użytkownika i "będzie właścicielem" konta (zakładając, że potrzebujesz istniejącego hasła przed zmianą haseł porywacz nie jest właścicielem konta e-mail, więc nie może używać "Nie pamiętam hasła" itp.).

Uważaj, aby tokeny nie były łatwe do odgadnięcia (tj. Powinny składać się z całkowicie losowych danych, np. Z CRNG).

Jeśli chcesz pójść o krok dalej, możesz zaszyfrować plik cookie przed wysłaniem go i odszyfrować go przy odbiorze. Co więcej, nie zakładaj, że porywacz nie zna klucza szyfrowania, więc sprawdź poprawność zawartości pliku cookie po odszyfrowaniu.

Ale wszystko, co powiedzieliśmy, wolimy używać stałego zarządzania sesją biblioteki zamiast przewracać własne.

+1

To jest znacznie lepsza odpowiedź niż zaakceptowana – Tommy

+2

Możesz łatwo unieważnić losowy token, jeśli użytkownik zmieni hasło, więc jest to zły powód. – nilskp

+0

@nilskp Ale musisz śledzić wydane żetony, nie? –

-1

Zawsze wiedziałem, że funkcja "zapamiętaj mnie" tylko przekształciła plik cookie sesji (np. Plik cookie z identyfikatorem sesji) z wygasającego przy zamykaniu przeglądarki na przyszłą datę, nie wiąże się z koniecznością zapisywania dodatkowych danych, tylko przedłużanie sesji.

I tak, jeśli osoba atakująca otrzyma plik cookie, może podszyć się pod użytkownika. Ale jest to zawsze ważne i nie ma nic wspólnego z "pamiętaj mnie".

3

jeśli Twoje pliki cookie zostaną skradzione, każdy może zalogować się na Twoje konta. w rzeczywistości to, co robi fajerwerk. zabezpieczenie polega na losowym tokenie. cały system zakłada, że ​​ciasteczka nie mogą zostać skradzione. jedyny inny sposób na wejście to odgadnięcie losowego tokena. jeśli zrobisz to wystarczająco długo, powinno być prawie niemożliwe.

0

"Krok", o którym wydaje się, że zapominasz, jest taki, że jeśli wartość pliku cookie zostanie odpowiednio zakodowana, będzie miała niewielką wartość dla atakującego.

EDIT:

Oto kilka rzeczy, które możesz zrobić, aby chronić użytkowników przed kradzieżą Cookie związanych ataków:

  • zregenerować żetonów w czasie, tak, że atakujący nie będzie w stanie podszywać użytkownika, chyba że ma wystarczająco dużo plików cookie. Jeśli bezpieczeństwo ma najwyższy priorytet, zregeneruj tokeny przy każdym żądaniu (ładowanie strony). Jeśli nie jest, zregeneruj tokeny po zmianie hasła.
  • Przechowuj i sprawdzaj skróty user agents, aby osoba atakująca nie mogła podszyć się pod użytkownika, chyba że ma zarówno plik cookie, jak i agenta użytkownika użytkownika.

p.s. Pliki cookie powinny zawierać (losowe) tokeny, a nie hasze hasła (patrz Hashes or tokens for "remember me" cookies?).

+4

Hash, czy nie, wartość cookie pozwala atakującemu podszywać się pod użytkownika. –

+0

Jest to fakt nieunikniony. Najlepszym rozwiązaniem, aby temu zapobiec, jest użycie szyfrowania end-to-end na dowolnej stronie, na której wysyłane jest ciasteczko "zapamiętaj mnie". – deed02392

+0

@Emanuil Rusev, jak ostatnio powiedziałeś: "Podanie pliku cookie atakującemu jest równoznaczne z obrażeniami, jak podanie mu Twojego hasła." –

4

nawet bym nie przechowuj nazwy użytkownika w pliku cookie, tylko losowy żeton wygenerowany near impossible to crack technique i map, które dla użytkownika w bazie danych, a nigdy sklep hasło użytkownika nawet zakodowane w pliku cookie, to będzie otwarte na Brute Force Attack. Tak, jeśli ktoś ukradnie token, będzie mógł uzyskać dostęp do konta użytkownika, ale hasło nie zostanie naruszone, a token zostanie unieważniony, gdy tylko prawdziwy użytkownik się wyloguje. Należy również pamiętać, że nie należy zezwalać na newralgiczne zadania, takie jak zmiana hasła dla użytkownika, który ma już ważny token, należy ponownie poprosić o hasło w przypadku takich zadań.

-1

Moje podejście jest następujące:

  1. Hash user_id
  2. wygenerować unikalny klucz dla użytkownika - md5(current_timestamp)
  3. Zapisz klucz do DB
  4. Koduje wszystko tak wygląda jak BS - base64
  5. Zachowaj w pliku cookie

Do tej pory działało dobrze dla mnie :)

+0

'md5 (current_timestamp)' nie jest unikalnym kluczem i można go odgadnąć patrząc na znacznik czasu utworzenia rejestracji. Jak porównać klucz i plik cookie? –

50

NIGDY nie należy przechowywać hasła użytkownika w pliku cookie, nawet jeśli jest zaszyfrowane !!

Spójrz na tym blogu:

Cytat:

  1. Gdy użytkownik pomyślnie loguje się z Remember Me zaznaczone, Plik cookie logowania jest wydany jako dodatek do standardowego pliku cookie zarządzania sesją. [2]
  2. Plik cookie logowania zawiera nazwę użytkownika, identyfikator serii i token. Seria i token to niepotrzebne liczby losowe z odpowiednio dużej przestrzeni. Wszystkie trzy są przechowywane razem w tabeli bazy danych.
  3. Gdy niezalogowany użytkownik odwiedza witrynę i prezentuje cookie logowania, nazwa użytkownika, seria i token są wyszukiwane w bazie danych.
  4. Jeśli triol jest obecny, użytkownik jest uznawany za uwierzytelniony. Używany token jest usuwany z bazy danych. Nowy token jest generowany, przechowywany w bazie danych z nazwą użytkownika i tym samym identyfikatorem serii, a nowy plik cookie do logowania, zawierający wszystkie trzy, jest wydawany użytkownikowi.
  5. Jeśli nazwa użytkownika i seria są obecne, ale token nie pasuje, zakłada się kradzież. Użytkownik otrzymuje ostrzeżenie o silnym brzmieniu i wszystkie zapamiętane sesje użytkownika są usuwane.
  6. Jeśli nazwa użytkownika i seria nie są obecne, plik cookie logowania jest ignorowany.
+5

To powinna być poprawna odpowiedź. – nilskp

+1

Zakładam, że token to po prostu długi, losowo wygenerowany łańcuch alfanumeryczny. Ale czym jest seria? Nie jestem pewien, czy rozumiem naturę tej wartości. Czy nazwa użytkownika + token nie wystarczy? Artykuł, do którego odnośnik się znajduje, już nie istnieje :-( – manuelflara

+0

"seria" jest używana do powiadamiania prawowitego użytkownika, że ​​ktoś już użył bieżącego ważnego tokena, wysyłasz serial1_token1 do legalnego użytkownika, ktoś kradnie serial1_token1 i używa go Generowany jest nowy token (serial1_token2) Teraz prawowity użytkownik generuje odsłonę, a system powinien powiadomić, że używa tokena (serial1_token1, który został zastąpiony przez 2), który był już używany przez kogoś innego. –

Powiązane problemy