Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Bezpieczeństwo i poprawność logowania
Forum PHP.pl > Forum > Przedszkole
Darekxp
Witam!

Czy takie logowanie jest w miare bezpieczne? Jeśli nie co jest nie tak? Za pomoc z góry dziękuję

  1. <?php
  2.  
  3. if($_SESSION['userId'] > 1)
  4. {
  5. header('Location: /index.php');
  6. }
  7. else {
  8.  
  9. $user = filter($_POST['login']);
  10. $password = md5(filter($_POST['password']));
  11. $query = mysql_query(' SELECT * FROM `users` WHERE userLogin="'.query($user).'" AND userPassword="'.query($password).'" AND userActive="yes" ');
  12.  
  13. if($query && mysql_num_rows($query) == 1)
  14. {
  15. while($row = mysql_fetch_array($query))
  16. {
  17. if (!isset($_SESSION['initiate']))
  18. {
  19. $_SESSION['initiate'] = true;
  20. $_SESSION['initiate'] = $new;
  21. $_SESSION['address_ip'] = $_SERVER['REMOTE_ADDR'];
  22. $_SESSION['userId'] = $row['userId'];
  23. $_SESSION['userLogin'] = $row['userLogin'];
  24. $_SESSION['userPassword'] = $row['userPassword'];
  25. $_SESSION['userActive'] = $row['userActive'];
  26. $_SESSION['userGroup'] = $row['userGroup'];
  27. $_SESSION['userName'] = $row['userName'];
  28. $_SESSION['userSurname'] = $row['userSurname'];
  29. $_SESSION['userCity'] = $row['userCity'];
  30. $_SESSION['userPhoneNumber'] = $row['userPhoneNumber'];
  31. $_SESSION['userEmail'] = $row['userEmail'];
  32. $_SESSION['userGGNumber'] = $row['userGGNumber'];
  33. $_SESSION['userAboutMe'] = $row['userAboutMe'];
  34. $_SESSION['userDateBirth'] = $row['userDateBirth'];
  35.  
  36. $_SESSION['userHideDateBirth'] = $row['userHideDateBirth'];
  37. $_SESSION['userHideSurname'] = $row['userHideSurname'];
  38. $_SESSION['userHidePhoneNumber']= $row['userHidePhoneNumber'];
  39. $_SESSION['userHideEmail'] = $row['userHideEmail'];
  40. $_SESSION['userHideGGNumber'] = $row['userHideGGNumber'];
  41. $_SESSION['userHideAboutMe'] = $row['userHideAboutMe'];
  42.  
  43. $_SESSION['userLastLogin'] = $row['userLastLogin'];
  44. $_SESSION['userLastLoginIP'] = $row['userLastLoginIP'];
  45.  
  46. mysql_query(' UPDATE `users` SET userLastLogin="'.query(date('Y-m-d H:i:s')).'" WHERE userId="'.query($_SESSION['userId']).'" LIMIT 1');
  47. mysql_query(' UPDATE `users` SET userLastLoginIP="'.query($_SERVER['REMOTE_ADDR']).'" WHERE userId="'.query($_SESSION['userId']).'" LIMIT 1');
  48.  
  49. header('Location: /myAccount');
  50. }
  51. }
  52. }
  53. else
  54. {
  55. systemMessage('Logowanie', 'Prawdopodobnie podałeś zły login, lub hasło.', '', '', 'login', 'Spróbuj ponownie się zalogować', '', '', '', 'COMMUNIQUE_ERROR');
  56. }
  57. }
  58.  
  59. ?>
vieri_pl
Na pewno możesz posolić hasło, samo md5 to dość mało.

PS: Dlaczego masz dwa razy mysql_query, linia 48,49? Przecież to jedno zapytanie załatwi wink.gif
pyro
Cały ten kod jest kompletnie bez sensu. Nie jest ani bezpieczny, ani wydajny, ani zgodny z zasadą DRY. Aż mi się nie chce wymieniać. Spróbuj to jeszcze raz napisać.
vieri_pl
Pyro, ale kod nie jest bez sensu bo spełnia swoje zadanie, usera zaloguje, a to w jakim stylu... Tak na dobrą sprawę kazałeś człowiekowi napisać to jeszcze raz nie podając mu żadnych wskazówek jak to powinno wyglądać.

Od siebie dodam:
- jeśli do wartości do sesji mają taką samą nazwę jak rekord w bazie to wystarczy zrobić foreach($row as $key => $val) i dopisać wszystko do sesji.
- na pewno nie musisz pobierać wszystkiego (*) z bazy by zobaczyć czy user istnieje, do tego nie musisz pobierać nawet więcej niż dwóch rekordów wink.gif
- $_SESSION['initiate'] najpierw true, a potem nie zdefiniowana zmienna $new? To notice.
- Zamiast funkcji date w PHP w zapytaniu możesz użyć NOW()
Niktoś
Przechowywanie wszystkiego w sesji,nie jest ani bezpieczne, ani wydajne.
PanGuzol
Korzystasz z $_SESSION w 3 linii ale session_start() masz dopiero w 17.
Van Pytel
Po co to:
  1. AND userPassword="'.query($password)


Lepiej pobrać login i hasło usera z bazy (WHERE login = login), a potem dopiero sprawdzić w php czy hasło równa się haśle (if...)
PanGuzol
Cytat(Van Pytel @ 21.04.2012, 11:30:32 ) *
Po co to:
  1. AND userPassword="'.query($password)


Lepiej pobrać login i hasło usera z bazy (WHERE login = login), a potem dopiero sprawdzić w php czy hasło równa się haśle (if...)

Lepiej przenieść jak najwięcej logiki do bazy danych. Czyli od razu w zapytaniu dać porównania do loginu i hasła, warto jeszcze do tego zrobić index unique dla loginu.
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.