Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dane dla zalogowanych - pytanie o bezpieczeństwo
gandziorz
post
Post #1





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


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. }


Ten post edytował gandziorz 29.11.2015, 20:56:46
Go to the top of the page
+Quote Post
rad11
post
Post #2





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Przydało by się jeszcze bindowanie danych.
I pytanie jakim sposobem hashujesz hasło ?

Ten post edytował rad11 29.11.2015, 21:33:05
Go to the top of the page
+Quote Post
gandziorz
post
Post #3





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


hasło w sesii, pomyłka. Na co Ci to?

Hasło w BD plain tekstem? Lepiej idź skoczyć z mostu.
Go to the top of the page
+Quote Post
gandziorz
post
Post #5





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


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.

Ten post edytował gandziorz 29.11.2015, 22:10:37
Go to the top of the page
+Quote Post
Comandeer
post
Post #6





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


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.


--------------------
Go to the top of the page
+Quote Post
gandziorz
post
Post #7





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


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?
Go to the top of the page
+Quote Post
Comandeer
post
Post #8





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


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.


--------------------
Go to the top of the page
+Quote Post
gandziorz
post
Post #9





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 20.12.2006

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


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?
Go to the top of the page
+Quote Post
Damonsson
post
Post #10





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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.

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 Aktualny czas: 22.08.2025 - 06:32