Logowanie - dylemat dotyczący bezpieczeństwa cookies

Witam,

zrobiłem formularz logowania oparty o… ciastka. Nigdy nie myślałem specjalne o względach bezpieczeństwa, dopiero teraz o tym myślę…

Obecny system wygląda tak:

Proces logowania

User loguje się, jeśli dane są prawidłowe - generowane jest ciasteczko o 7 dniowej ważności. W ciasteczku przechowuję klucz sesji, ciąg o długości ok. 20 znaków np. “xyz”. Identyczny klucz zapisuję w bazie danych mysql w historii sesji / logowania wraz z adresem IP z którego user się logował.

Dostęp do zastrzeżonej strony

Ktoś wchodzi na zastrzeżoną stronę chronioną hasłem. Wyciągam klucz z ciasteczka i sprawdzam czy w bazie mysql faktycznie istnieje takowy klucz - sprawdzam dalej, czy użytkownik ma nadal ten sam IP z którego się logował. Jeśli oba warunki są spełnione - wyciągam z bazy ID usera który jest zalogowany z takim kluczem sesji. Jeśli któryś z warunków jest niespełniony - traktuję usera jako niezalogowanego.

Wylogowanie

Kasuję klucz sesji z bazy danych oraz usuwam ciasteczko na komputerze użytkownika.

Prosiłbym o pomoc dotyczącą bezpieczeństwa - w jakim stopniu jest ta metoda bezpieczną? Czy lepiej oprzeć system w całości o sesje niż o ciasteczka (ciasteczka mają to do siebie, że można manipulować datą ważności, używać opcji “zapamiętaj mnie”)?

Wiem, że istnieje możliwość wykradnięcia ciastka… Ale chyba klucz sesji też można komuś wykraść…? #-o

Będę wdzięczny za każdą uwagę.

To nie ma znaczenia. Na dobrą sprawę są dwa krytyczne punkty, obarczone ryzykiem wykradnięcia sesji i żadne z nich nie zależy od tego czy użyto ciastka czy sesji.

  1. Komputer użytkownika. Pierwsza zasada bezpieczeństwa mówi, że jeśli ktoś poza Tobą ma fizyczny dostęp do komputera, to już nie jest Twój komputer. Uproszczając, np. jeśli masz zainstalowanego keyloggera, no to nic nie pomoże.

  2. Węzły przesyłowe. Teoretycznie ktoś może sniffować pakiety i nie ważne czy jest to ciastko, czy sesja, bo nie szyfrując transmisji i tak ktoś może podejrzeć ramkę TCP w której zostało przesłane hasło i login, więc na dobrą sprawę po co mu sesja? Z drugiej strony jeśli wszystko szyfrujesz, to zaszyfrowane będzie też wysyłane ciasteczko, tak więc problem znika. Zresztą sesja to nie jest jakaś magia, tylko po stronie użytkownika przechowywane jest ciasteczko z kluczem sesji.

Poza tym nie widzę sensu w tym co robisz. Niepotrzebnie tylko obciążasz bazę danych. Mechanizm sesji + HTTPS spokojnie wystarczy. Oczywiście musisz brać pod uwagę, że nie istnieje 100% zabezpieczenie, nawet szyfrowanie, bo opiera się ono na założeniu, że algorytmy klasy P!=NP. Całe zabezpieczanie polega na jak największym utrudnieniu życia, osobie chcącej dokonać włamania (aby koszty jakie poniesie przekraczały zysk, który uzyska). Zapisywaniem sesji id ciastka do bazy tak naprawdę duplikujesz funkcjonalność sesji, a dodatkowo wykonujesz nie potrzebne operacje na bazie danych, czyli operacje dyskowe. A tych starajmy się unikać, bo są dużo wolniejsze od operacji na pamięci operacyjnej.

To nie jest prawda. Nie wiem w czym piszesz, ale np.

PHP, masz to: http://www.php.net/manual/en/session.co … e-lifetime

JEE, będzie to coś takiego

...

20


   ...

więc podejrzewam, że każdy język dostarcza API do manipulacji czasem życia sesji, bo jest to przewidziane w RFC.