Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]bezpieczne logowanie, bezpieczeństwo poważnego projektu
gitbejbe
post
Post #1





Grupa: Zarejestrowani
Postów: 516
Pomógł: 63
Dołączył: 27.08.2012

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


Witam. Mam pytanie czysto teoretyczne tak więc nie będę wklejał niepotrzebnie kodu.
Przeleciałem już kilkanascie stronn na tym forum w poszukiwaniu pomocy, również w googlasie nie jest łatwo odzszukac jednoznaczej odpowiedzi na mój problem.

Muszę zrobić jak najbezpieczniejsze logowanie. Robie duży projekt, w którym w gre już wchodzą pieniądze na kontach użytkowników.

Dlatego tez mam pytanie odnośnie logowania, najpierw zaczne od tego co zrobiłem.

w moim formularzu, mozna logowac sie poprzez email/login i hasło

-najpierw pobieram dane i nakładam na nie "htmlspecialchar"
-sprawdzam później poprzez wyrażenia regularne w php, czy oba pola posiadają dozwolone znaki. Dla loginu przewiduje tylko litery, cyfry i znaki używane w mailach. Dla hasła tylko cyfry i litery.
- jeśli jest ok, sprawdzam, czy ktoś taki istnieje - po loginie albo emailu (poprzez funkcje sprawdzam kto co podał do logowania)
- sprawdzam tylko czy istnieje takie ID w bazie i czy konto jest aktywne, jeśli tak pobieram tylko ID.
- jeśli istnieje, tworze sesje i narazie to wszystko

co do trzech pierwszy punktów, chce jeszcze dodać dla hasła znaki specjalne dla zwiększenia siły i wymóg w rejestracji do stosowania znaków specjalnych.
mam dodaną również blokadę logowania dla IP na 15min jeśli w ciagu 5minut logował się bez powodzenia 20razy.
Hasła są pięknie kodowane w sh1 i solone tak, że nie ma bata na złamanie.

do sesji dodaje tylko ID użytkownika na zasadzie $_SESSION['identyfikator'] = $row['id']. No a póżniej sprawdzam czy istnieje taka sesja na odpowiednich stronach

no i teraz odnośnie tworzenia sesji. Tutaj jest mój dylemat. Nie mogę sobie pozwolić na ataki, gdzie ktoś mógłby wejść na czyjeś konto i np zażądać wypłaty jego pieniędzy.
Naczytałem się, że najbezpieczniej jest użyć do tego ciastek, gdzie do takiego ciastka wrzucam np te ID z sesji i sprawdzam za każdym razem czy sesja i ciastko są takie same. Wolałbym jednak nie bawić się w ciastka ze względu na to, że każdy ma prawo je blokować w przeglądarce.

Wytłumaczcie mi jeszcze, jeśli zna ktoś mój identyfikator sesji czyli dla $_SESSION['identyfikator'] jest nią string "identyfikator", to co wtedy ? jakiś przykład ?

Jak ktoś ma z was dobre doświadczenie odnośnie bezpieczeństwa sesji, prosze o pomoc merytoryczną jak najlepiej się zabezpieczyć. Tylko prosze prostym językiem i łopatologicznie bo jeszcze nigdy takich zabezpieczeń dla sesji nie robiłem.

Ten post edytował gitbejbe 4.06.2013, 06:41:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Zamotałem się z tym Twoimi pytaniami ale po kolei (IMG:style_emoticons/default/smile.gif)

1. Co do IP to poprawka ber32 jest w sumie ok bo HTTP_X_FORWARDED_FOR potrafi zwracać różne kosmosy - trzeba by to było ładnie obsłużyć a szczerze nie wiem czy jest sens (IMG:style_emoticons/default/smile.gif)
2. Co do funkcji spr_przegladarke to przegiales - nie wykrywaj co to za przeglądarka w taki sposób - uproszczasz skrypt...

Jeśli koleś wejdzie z IE 10 to wystarczy IE 9 i już system się nie połapie. Najwięcej danych jest w $_SERVER['HTTP_USER_AGENT'] i to powinieneś zapisać a nie po przetworzeniu. Najlepiej zrobić tak:

  1.  
  2. function generateAuthHash() {
  3. if(!isset($_SERVER['HTTP_USER_AGENT'])) return false; // jeśli nie ma USER_AGENT to na bank mamy request nie z przeglądarki
  4.  
  5. $ip = ip();
  6. $browserId = $_SERVER['HTTP_USER_AGENT'].(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : 'empty_accept_language_string';
  7.  
  8. return sha1('salt1'.$ip.'salt2'.$browserId.'salt3');
  9. }
  10.  
  11. // przy logowaniu:
  12.  
  13. $hash = generateAuthHash();
  14. if(!$hash) die('Użyj przeglądarki cfaniaczku!');
  15.  
  16. setcookie('AUTH',$hash); // nie podawaj czasu - ciastko będzie kasowane razem z ciastkiem sesji
  17.  
  18. // przy sprawdzaniu czy zalogowany (idea):
  19.  
  20. if(isset($_COOKIE['AUTH'])) {
  21. $hash = generateAuthHash();
  22. if(!$hash) die('Użyj przeglądarki cfaniaczku!');
  23.  
  24. if($hash != $_COOKIE['AUTH']) die('Coś kombinujesz koleś!');
  25.  
  26. echo 'witaj ;)';
  27. }
  28.  


Cytat
dodam jeszcze, ze przy wylogowaniu usuwa sesje i ciastko.


Super ale mam nadzieję, że tylko po prostu usuwasz ciastka danemu gościowi z przeglądarki - tak żebyś nie usuwał fizycznie sesji - bo wylogujesz normalnie zalogowanego usera (IMG:style_emoticons/default/wink.gif)

Ten post edytował Sephirus 5.06.2013, 07:53:51
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 6.01.2026 - 22:14