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
kosmaty_zab
post
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 1
Dołączył: 7.06.2013

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


Ja to zrobiłem tak (na podstawie pracy użytkowników wyżej)
logowanie
  1. if (empty($_SESSION['login']) || empty($_SESSION['password'])){
  2. @$_SESSION['login'] = trim($_POST['login']);
  3. @$_SESSION['password'] = trim($_POST['password']);
  4. }
  5. //logowanie
  6. if (empty($_SESSION['login']) || empty($_SESSION['password']))
  7. include('logowanie.html');
  8. else{
  9. if(sprawdzenie_sesji(@$_COOKIE['AUTH'])){
  10. echo "Witaj, <b>".$_SESSION['login']."</b>"." "."<a href=\"wyloguj.php\">[Wyloguj]</a><br><br>";
  11. echo "<a href=\"admin_panel.php\">Panel Administratora</a>";
  12. }
  13. elseif(logowanie_sprawdzanie ($_SESSION['login'], $_SESSION['password'])){
  14. $hash = generateAuthHash();
  15. if(!$hash) die('Użyj przeglądarki cfaniaczku!');
  16. setcookie('AUTH',$hash); // nie podawaj czasu - ciastko będzie kasowane razem z ciastkiem sesji
  17. echo "Witaj, <b>".$_SESSION['login']."</b>"." "."<a href=\"wyloguj.php\">[Wyloguj]</a><br><br>";
  18. echo "<a href=\"admin_panel.php\">Panel Administratora</a>";
  19. }
  20. else{
  21. echo "Podane hasło lub login jest nieprawidłowe. Proszę spróbować ponownie.";
  22. include('logowanie.html');
  23. }
  24. }
  25.  


i niezbędne funkcje
  1. function logowanie_sprawdzanie ($login, $password){
  2. @ $db = mysqli_connect('localhost', 'nazwa użytkownika', 'hasło', 'nazwa bazy');
  3. if(!$db){
  4. echo "Połączenie z bazą danych nie powiodło się.";
  5. exit();
  6. }
  7. $zapytanie = "select login, password from admin where login='".$login."' and password='".sha1($password)."'";
  8. $wynik = mysqli_query($db, $zapytanie);
  9.  
  10. $ile_znalezionych = mysqli_num_rows($wynik);
  11. if ($ile_znalezionych!=1)
  12. return false;
  13. elseif ($ile_znalezionych=1)
  14. return true;
  15.  
  16. mysqli_close($db);
  17. }
  18.  
  19. function ip(){ //sprawdzanie i wyślatlanie adresu ip
  20. if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) // wartość superglobalnych
  21. $tt = $_SERVER["REMOTE_ADDR"]." proxy"; /// ip proxy
  22. else
  23. $tt = $_SERVER['REMOTE_ADDR'];
  24.  
  25. return $tt; // ." ".$tt_g
  26. }
  27.  
  28. function generateAuthHash() {
  29. if(!isset($_SERVER['HTTP_USER_AGENT']))
  30. return false; // jeśli nie ma USER_AGENT to na bank mamy request nie z przeglądarki
  31. $ip = ip();
  32. $browserId = $_SERVER['HTTP_USER_AGENT'].isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : 'empty_accept_language_string';
  33.  
  34. return sha1('$@#FFE$%'.$ip.'@#$ASDAYJ$%!'.$browserId.'!@#%@$#DWD#$@%');
  35. }
  36.  
  37. function sprawdzenie_sesji($a){
  38. if(isset($a)){
  39. $hash = generateAuthHash();
  40. if(!$hash)
  41. return false;
  42. if($hash != $a)
  43. return false;
  44. }
  45. else
  46. return false;
  47.  
  48. return true;
  49. }


wylogowanie
  1. setcookie('AUTH',' ', time()-3600);
  2.  
  3. header("Refresh: 0; url=index.php");
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: 31.12.2025 - 11:38