Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dane dla zalogowanych - pytanie o bezpieczeństwo
Forum PHP.pl > Forum > PHP
gandziorz
Witam,
Jestem w trakcie pisania funkcji logowania i weryfikacji czy ktoś jest zalogowany.

Czy możecie pomóc mi określić bezpieczeństwo mojego systemu?

LOGOWANIE - przed wprowadzeniem danych do funkcji login wcześniej weryfikuje dane wprowadzone przez klienta
  1. function login($login, $pass) {
  2. global $mysqli;
  3. $login = mysqli_real_escape_string($mysqli, $login);
  4.  
  5. //sprawdzamy czy istnieje login
  6. $query = "SELECT * FROM `rds_admin` WHERE `login` ='". $login ."'";
  7. $result = mysqli_query($mysqli, $query);
  8. $cnt = mysqli_num_rows($result);
  9. //jezeli brak wynikow zwracamy FALSE
  10. if ($cnt == 0) {
  11. return false;
  12. } else {
  13. //sprawdzamy czy haslo zgadza się z tym zapisanym w mysql
  14. $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
  15.  
  16. if ($row['password'] == $pass) {
  17. //tworzymy hash który będzie zapisany w sesji
  18. $options = [
  19. 'cost' => 12,
  20. ];
  21. $hash = password_hash($pass, PASSWORD_BCRYPT, $options);
  22. $_SESSION["lo"] = $login;
  23. $_SESSION["lh"] = $hash;
  24. return true;
  25. } else {
  26. return false;
  27. }
  28. }}
  29.  


WERYFIKACJA - zwraca true lub false w zależności czy ktoś jest zalogowany
  1. //sprawdzanie czy ktoś jest zalogowany, zwraca TRUE w przypadku kiedy wszystko się zgadza i FALSE w przypadku kiedy nie
  2. function auth () {
  3. global $mysqli;
  4. $login = $_SESSION['lo'];
  5. $hash = $_SESSION['lh'];
  6. $login = mysqli_real_escape_string($mysqli, $login);
  7.  
  8. if (empty($login)) {
  9. return false;
  10. } else {
  11. //pobieranie danych z mysql
  12. $query = "SELECT * FROM `rds_admin` WHERE `login` ='". $login ."'";
  13. $result = mysqli_query($mysqli, $query);
  14. $cnt = mysqli_num_rows($result);
  15. if ($cnt == 0) {
  16. return false;
  17. } else {
  18. $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
  19.  
  20. if (password_verify($row['password'], $hash)) {
  21. return true;
  22. } else {
  23. return false;
  24. }
  25.  
  26. }
  27. }}


WYLOGOWANIE
  1. function logout() {
  2. }


Na stronie pliki które chcemy ukryć dla niezalogowanych na górze wówczas dajemy komendę:
  1. if (!(auth())) {
  2. header('Location: index.php?a=loguj');
  3. }
rad11
Przydało by się jeszcze bindowanie danych.
I pytanie jakim sposobem hashujesz hasło ?
gandziorz
Cytat(rad11 @ 29.11.2015, 21:25:00 ) *
Przydało by się jeszcze bindowanie danych.
I pytanie jakim sposobem hashujesz hasło ?

http://php.net/manual/en/function.password-hash.php

Rozwiniesz myśl o bindowaniu danych?

Ps. Używam mysqli ponieważ jest szybsze niż PDO. Za to w projektach gdzie jest mysql/postresql używam PDO smile.gif
Pyton_000
hasło w sesii, pomyłka. Na co Ci to?

Hasło w BD plain tekstem? Lepiej idź skoczyć z mostu.
gandziorz
Cytat(Pyton_000 @ 29.11.2015, 22:01:58 ) *
hasło w sesii, pomyłka. Na co Ci to?

Hasło w BD plain tekstem? Lepiej idź skoczyć z mostu.

W sesji zapisany jest tylko hash. Jako tako hasła tam nie ma.
W bazie owszem hasło nie jest zakodowane.
Comandeer
Cytat
Rozwiniesz myśl o bindowaniu danych?

http://php.net/manual/en/mysqli.quickstart...-statements.php

Hasło w sesji Ci na nic (hash też), więc tego nie przechowuj. Natomiast w bazie danych zamiast hasła przechowuj hash.
gandziorz
Cytat(Comandeer @ 29.11.2015, 22:22:44 ) *
http://php.net/manual/en/mysqli.quickstart...-statements.php

Hasło w sesji Ci na nic (hash też), więc tego nie przechowuj. Natomiast w bazie danych zamiast hasła przechowuj hash.

To gdzie wysłać dane jak nie w sesji? Cookie?
Comandeer
W cookie to już de facto podanie tego na talerzu.
Nie, po prostu hasła ani jego hashu nie trzyma się w sesji. Bo po co Ci to tam? A samą weryfikację ograniczyłbym do sprawdzenia czy są ustawione odpowiednie zmienne sesyjne.
gandziorz
Cytat(Comandeer @ 29.11.2015, 22:53:29 ) *
W cookie to już de facto podanie tego na talerzu.
Nie, po prostu hasła ani jego hashu nie trzyma się w sesji. Bo po co Ci to tam? A samą weryfikację ograniczyłbym do sprawdzenia czy są ustawione odpowiednie zmienne sesyjne.

Czyli do sesji wysyłam zamiast zakodowanego hasła... ?
Jeżeli dam informację w postaci zwrotu id użytkownika zapisanego w mysql i informacje czy ktos jest zalogowany, np.
$_SESSION['id'] = "id uzytkownika w mysql";
$_SESSION['log'] = true;

To nie będzie to zbyt narażone że ktoś podmieni "id" i w ten sposób zaloguje się na obce konto?
Damonsson
Do $_SESSION w normalnym przypadku się nie dostaniesz.

Ten global $mysqli; Może się kiedyś na Tobie zemścić, miej to na uwadze.

No i jak przedmówcy pisali, hasła NIGDZIE nie trzymasz plain textem. Hasło trzymasz tylko tam gdzie jest to absolutnie niezbędne, czyli w bazie danych w tym przypadku.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.