Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Bezpieczny system logowania
Displace
post 28.11.2010, 15:41:30
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.07.2010

Ostrzeżenie: (0%)
-----


Witam,

Próbuję od jakiegoś czasu napisać skrypt logowania, ale tak, aby był jak najbardziej bezpieczny. Jakiekolwiek włamanie na konto użytkownika jest w moim przypadku niedopuszczalne. W internecie dużo jest "poradników" czy też "kursów" na ten temat. A pisząc poradniki, jeszcze w cudzysłowu mam na myśli to, że w 95% przypadków jest to zwykły system oparty na sesjach, bez jakichkolwiek zabezpieczeń. W większości przypadków nie jest to też to, czego szukam.

Docelowo muszę napisać system logowania z możliwością zapamiętania użytkownika na danym komputerze - jedynym słusznym rozwiązaniem jest użycie sesji i cookies.

I teraz jak to ugryźć?
1) Czy wystarczy samo session_regenerate_id(), czy coś jeszcze można by było dorzucić do kodu?
2) Czy warto stworzyć osobną tabelę w bazie danych specjalnie dla sesji? Jeśli tak, to na jakiej zasadzie by to działało i jakie pola powinny się w niej znaleźć? Dla przykładu, oto tabele z phpBB3, niestety nie wiem w jaki sposób rozwiązano tam ten problem, gdyż cały kod tegoż forum jest za długi i nie da się go jednocześnie przeczytać i zrozumieć.
  1. CREATE TABLE `sessions` (
  2. `session_id` varchar(32) BINARY NOT NULL DEFAULT '',
  3. `session_user_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  4. `session_forum_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  5. `session_last_visit` int(11) UNSIGNED NOT NULL DEFAULT '0',
  6. `session_start` int(11) UNSIGNED NOT NULL DEFAULT '0',
  7. `session_time` int(11) UNSIGNED NOT NULL DEFAULT '0',
  8. `session_ip` varchar(40) BINARY NOT NULL DEFAULT '',
  9. `session_browser` varchar(150) BINARY NOT NULL DEFAULT '',
  10. `session_forwarded_for` varchar(255) BINARY NOT NULL DEFAULT '',
  11. `session_page` blob NOT NULL,
  12. `session_viewonline` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
  13. `session_autologin` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  14. `session_admin` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
  15. PRIMARY KEY (`session_id`),
  16. KEY `session_time` (`session_time`),
  17. KEY `session_user_id` (`session_user_id`),
  18. KEY `session_fid` (`session_forum_id`)
  19. ) TYPE=MyISAM;
  20.  
  21. CREATE TABLE `sessions_keys` (
  22. `key_id` varchar(32) BINARY NOT NULL DEFAULT '',
  23. `user_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
  24. `last_ip` varchar(40) BINARY NOT NULL DEFAULT '',
  25. `last_login` int(11) UNSIGNED NOT NULL DEFAULT '0',
  26. PRIMARY KEY (`key_id`,`user_id`),
  27. KEY `last_login` (`last_login`)
  28. ) TYPE=MyISAM;

3) W jaki sposób rozwiązać problem z zapamiętaniem użytkownika, co wysyłać w ciastkach aby było w miarę bezpiecznie?


Nie przyjmuję gotowców! (choć chyba i tak nikt mi go dawać nie zamierzał winksmiley.jpg) Proszę tylko o jasne nakreślenie mi tego w jaki sposób mógłbym to napisać, aby było w miarę prosto, ale i bezpiecznie. Zaznaczam również, że lubię czytać i chętnie przyjmę posty dłuższe niż 3 zdania.
Go to the top of the page
+Quote Post
Szadow
post 28.11.2010, 15:43:29
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 6
Dołączył: 21.11.2010

Ostrzeżenie: (0%)
-----


Polecam: http://webmade.org/porady/bezpieczenstwo-p...on-xss-csrf.php


--------------------
Pomogłem? Kliknij przycisk Pomógł. ;)
Go to the top of the page
+Quote Post
AndyPSV
post 28.11.2010, 16:39:13
Post #3





Grupa: Zarejestrowani
Postów: 393
Pomógł: 5
Dołączył: 6.02.2003
Skąd: The.Luciferian.Doctrine.p
df

Ostrzeżenie: (30%)
XX---


certyfikat ssl polecam
ciasteczka wysylasz normalnie, nie zapisujesz ich (bez mozliwosci sesji), tylko do zamkniecia przegladarki lub np. 10 minut (na sesje)

szyfrowanie w bazie danych (hasel) np. md5+sha1+ciag; niemozliwosc ustawienia uzytkownikowi hasla krotszego niz x;
Go to the top of the page
+Quote Post
Displace
post 1.12.2010, 21:53:07
Post #4





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.07.2010

Ostrzeżenie: (0%)
-----


Ok, dzięki, już powoli sobie to w myślach wszystko nakreśliłem, prosiłbym tylko zweryfikować, czy wszystko jest poprawnie.


SESJE:
1) Tymczasowa (tylko sesje) - logowanie jedynie na czas działania przeglądarki. Po jej zamknięciu, session_id ginie bezpowrotnie.
2) Stała (sesje i cookies) - logowanie z opcją "zapamiętaj mnie". Session_id przechowywane w ciasteczku.

Opiszę tylko tą pierwszą, druga będzie podobna. Jest to lista kroków, jaką PHP realizuje na każdej ze stron dla zalogowanych.
  1. Sprawdzenie czy id sesji istnieje w bazie. Jeżeli tak, kontynuuj, jeżeli nie, wyświetl panel logowania.
  2. Czy IP jest zgodne z IP zapisanym w bazie danych w chwili zalogowania? Jeżeli nie, naruszono zasady bezpieczeństwa, ale kontynuuj.
  3. Czy przeglądarka jest zgodna z przeglądarką zapisaną w bazie danych w chwili zalogowania? Jeżeli nie, naruszono zasady bezpieczeństwa, ale kontynuuj.
  4. Czy zgadzają się dane: $_SESSION['id_konta'] i $_SESSION['prawa'] z tymi, zapisanymi w bazie danych? Jeżeli nie, naruszono zasady bezpieczeństwa, ale kontynuuj.
  5. Czy naruszono w jakikolwiek sposób zasady bezpieczeństwa? Jeżeli tak to przerwij działanie, skasuj odpowiedni rekord z bazy danych, zniszcz wszystkie sesje i zmień id_sesji, a następnie wyświetl komunikat i przekieruj na stronę logowania.
  6. Jeżeli wszystko jest ok, zanotuj datę i godzinę "ostatniej przeprowadzonej akcji" (załadowanie strony), a następnie wyświetl zawartość strony.


Oczywiście, sesja wpisana do bazy danych jest kasowana po 40-60 minutach bezczynności (wymaga tak długiego czasu działania moja strona, aby nic przypadkiem się w formularzu usera nie wykasowało gdy ten będzie długo pisał).

Czy dobrze to wszystko wymyśliłem? Można coś jeszcze do tego dodać?


I najtrudniejsze pytanie - sesja stała, czyli cookies. Jak zweryfikować użytkownika? Po czym? IP odpada, gdyż jeżeli user będzie miał zmienne, to opcja "zapamiętaj mnie" będzie na dłuższą metę nic nie warta. Przeglądarka? Ok. Ale to chyba za mało. Może coś jeszcze jest o czym zapomniałem?
Go to the top of the page
+Quote Post
marcio
post 2.12.2010, 02:55:51
Post #5





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat
I najtrudniejsze pytanie - sesja stała, czyli cookies. Jak zweryfikować użytkownika? Po czym? IP odpada, gdyż jeżeli user będzie miał zmienne, to opcja "zapamiętaj mnie" będzie na dłuższą metę nic nie warta. Przeglądarka? Ok. Ale to chyba za mało. Może coś jeszcze jest o czym zapomniałem?

unikalne id user'a generowane za pomoca uniqid()

CO do systemu logowania:
sprawdzenie przegladarki
hash hasla normalka
anty brute force itp...itd... czyli ograniczona ilosc prob i bledow
filtrowanie zmiennych w zapytaniach slq
walidacja formularza logowania


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Mephistofeles
post 2.12.2010, 15:13:49
Post #6





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Oczywiście nie zapomnij przy tych wszystkich zabezpieczeniach o XSS, CRSF i SQL Injection winksmiley.jpg.
Zapisuj sobie przeglądarkę, ip (aż tak często się nie zmienia), możesz jakieś dodatkowe ciastko oprócz session id dodać.
Go to the top of the page
+Quote Post
Fifi209
post 2.12.2010, 15:16:42
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Mephistofeles @ 2.12.2010, 15:13:49 ) *
możesz jakieś dodatkowe ciastko oprócz session id dodać.

A co to zmieni? Jak ktoś mu ukradnie sid z ciastka to i inne może ukraść.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Mephistofeles
post 2.12.2010, 15:33:36
Post #8





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Można liczyć, że nie będzie na tyle sprytny żeby to wykorzystać biggrin.gif.
Go to the top of the page
+Quote Post
Fifi209
post 2.12.2010, 16:01:20
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Mephistofeles @ 2.12.2010, 15:33:36 ) *
Można liczyć, że nie będzie na tyle sprytny żeby to wykorzystać biggrin.gif.

Równie dobrze można mieć dziurawe skrypty i liczyć, że nie będzie na tyle sprytny, aby to wykorzystać.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Displace
post 2.12.2010, 17:12:27
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.07.2010

Ostrzeżenie: (0%)
-----


Cytat(Mephistofeles @ 2.12.2010, 15:13:49 ) *
ip (aż tak często się nie zmienia)


Ja mam zmienne IP i też chciałbym skorzystać z opcji "zapamiętaj mnie" winksmiley.jpg
Pomysły typu dwa ciastka... hmm - jeżeli ktoś już zechce się włamać na moją stronę, to na pewno nie amator.
Go to the top of the page
+Quote Post
Mephistofeles
post 2.12.2010, 17:26:16
Post #11





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


"Zapamiętaj mnie" to dla mnie zaprzeczenie bezpieczeństwa, przynajmniej na taką skalę jaką ty chcesz.
Jeśli zależy ci wyłącznie na bezpieczeństwie zrób hasła jednorazowe albo maskowane, do tego oczywiście SSL.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 08:46