Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sesje - bezpieczne logowanie
Forum PHP.pl > Forum > PHP
deha21
Witam,
Robię system logowania. Jako, że z sesji nie wiele rozumiem to dlatego zapytam się tutaj, czy dobrze jest to zrobione? Korzystałem z mojego starego skryptu logowania i z wikipedii winksmiley.jpg
Jak to lepiej zabezpieczyć?
  1.  
  2. if (!isset($_SESSION['init'])) {
  3. $_SESSION['init'] = true;
  4. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  5. }
  6.  
  7. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
  8. die('Próba przejęcia sesji udaremniona');
  9. }
  10.  
  11. if(!isset($_SESSION['user'])) {
  12. $_SESSION['user']=0;
  13. }
  14.  
  15. if ($_SESSION['user'] > 0) {
  16. header ("Location: main.php");
  17. } else {
  18.  
  19. if($_SERVER['REQUEST_METHOD'] == "POST") {
  20.  
  21. require("../config.php");
  22.  
  23. $result=mysql_query("SELECT * FROM admin WHERE login='".htmlspecialchars($_POST['login'])."'");
  24. $row=mysql_fetch_array($result);
  25.  
  26. if (isset($row)) {
  27.  
  28. if (isset($_POST['login'])==$row['login']) {
  29.  
  30. if (md5(htmlspecialchars($_POST['password']))==$row['password']) {
  31. $_SESSION['user']=$row['id'];
  32. header ("location: main.php");
  33. } else {
  34. echo "<div id='loginbox'><span>Złe hasło</span><br>
  35. <form action='' method='post'>
  36. Login:<br><input type='text' name='login'><br>
  37. Hasło:<br><input type='password' name='password'><br>
  38. <input type='submit' value='Loguj'></div>";
  39. }
  40.  
  41. } else {
  42. echo "<div id='loginbox'>
  43. <span>Nie ma takiego użytkownika</span><br>
  44. <form action='' method='post'>
  45. Login:<br><input type='text' name='login'><br>
  46. Hasło:<br><input type='password' name='password'><br>
  47. <input type='submit' value='Loguj'></div>";
  48. }
  49. }
  50.  
  51.  
  52. } else {
  53. echo "<div id='loginbox'><form action='' method='post'>
  54. Login:<br><input type='text' name='login'><br>
  55. Hasło:<br><input type='password' name='password'><br>
  56. <input type='submit' value='Loguj'></div>";
  57. }
  58.  
  59. }


I teraz jeszcze jedna sprawa. To u góry to strona logowania. A teraz chce zrobić, że jak ktoś wejdzie na inną zabezpieczoną stronę to go przekierowuje do logowania:
  1. <? ob_start();
  2.  
  3.  
  4. if (!isset($_SESSION['init'])) {
  5. $_SESSION['init'] = true;
  6. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  7. }
  8.  
  9. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
  10. die('Próba przejęcia sesji udaremniona');
  11. }
  12.  
  13. if(!isset($_SESSION['user'])) {
  14. $_SESSION['user']=0;
  15. }
  16.  
  17. if ($_SESSION['user'] > 0) {
  18.  
  19. ?>
  20.  
  21. <html>
  22. bla bla

Ten kod u góry to header.php który includowany jest np. przez dodajnewsa.php. Dodajnewsa.php na końcu includuje plik footer.php który wygląda tak:
  1. </div>
  2. </body>
  3. </html>
  4. <? } else { header ("Location: index.php"); exit; } ob_end_flush(); ?>

W poprzednim skrypcie miałem podobnie zrobione z tym, że tam nie było includowania headera ani footera, tylko ich kod był na stałe w pliku. I to pewnie przez to wyskakuje mi teraz taki błąd:
  1. Parse error: syntax error, unexpected $end in D:\HTTP\edeck 4\admin\header.php on line 61

Linijka 61 to ostatnio linijka headera, który jest includowany na poszczególne strony.
dziurson
szukaj brakującego średnika, nawiasu, klamry czy czegoś podobnego
deha21
Tyle to wiem, niestety żadnego tego typu błędu nie znalazlem. Czy może to być przez to includowanie albo przez coś innego?
gothye
a oprócz tego zmień :

  1. htmlspecialchars($_POST['login'])


na 

  1. addslashes(htmlspecialchars($_POST['login']))


skoro to ma być bezpieczne logowanie winksmiley.jpg

dziurson
to może wklej te 61 linii i pomyślimy. bo tak trudno stwierdzić. i wątpię by to był błąd od include
deha21
Te 61 lini to pierwszy kod który wkleiłem (jest tam 62, widocznie gdzieś mi sie enter wklepał).
dziurson
No to wychodzi na to że nie możesz otworzyć if-a w jednym pliku i go zamknąć w innym pliku.
deha21
Musi być jakies wyjście winksmiley.jpg Na wielu stronach z gdzie korzystają z sesji widziałem taką konstrukcję strony gdzie header i footer sa includowane... Hmm. Pokombinuję jeszcze. Jak ktoś ma jakiś pomysł to piszcie. Również jeśli chodzi o kwestie bezpieczeństwa.
dziurson
Ja na przykład robię na odwrót - jest jeden plik index z zabezpieczeniami a treść jest includowana. Później jakieś mod_rewrite i jest ok
Co do bezpieczeństwa to może md5 zamienić na sha-1
deha21
Zrobiłem coś takiego na początku header.php:
  1.  
  2.  
  3. if (!isset($_SESSION['init'])) {
  4. $_SESSION['init'] = true;
  5. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  6. }
  7.  
  8. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
  9. die('Proba przejecia sesji udaremniona');
  10. }
  11.  
  12. if(!isset($_SESSION['user'])) {
  13. $_SESSION['user']=0;
  14. }
  15.  
  16. if ($_SESSION['user'] <= 0) {
  17. die("Niezalogowany");
  18. }


Jeśli zamiast die zrobiłbym przekierowanie na plik logowania to teoretycznie nie musiałbym się martwić, że ktoś wejdzie na jakąś nieodpowiednią stronę bo go od razu przekieruje. I tak się dzieje. Z tym, że nawet jak się zaloguję i kliknę sobie na inną stronę która korzysta z tej sesji to pisze mi, że jestem "Niezalogowany". Może jest jakiś błąd w tym pierwszym kodzie mojego pierwszego posta?
dziurson
  1. $result=mysql_query("SELECT * FROM admin WHERE login='".htmlspecialchars($_POST['login'])."'");
  2. $row=mysql_fetch_array($result);
  3.  
  4. if (isset($row)) {
  5.  
  6. if (isset($_POST['login'])==$row['login']) {
  7.  
  8. if (md5(htmlspecialchars($_POST['password']))==$row['password']) {
  9. $_SESSION['user']=$row['id'];
  10. header ("location: main.php");
  11. } else {
  12. echo "<div id='loginbox'><span>Złe hasło</span><br>
  13. <form action='' method='post'>
  14. Login:<br><input type='text' name='login'><br>
  15. Hasło:<br><input type='password' name='password'><br>
  16. <input type='submit' value='Loguj'></div>";
  17. }
  18.  
  19. } else {
  20. echo "<div id='loginbox'>
  21. <span>Nie ma takiego użytkownika</span><br>
  22. <form action='' method='post'>
  23. Login:<br><input type='text' name='login'><br>
  24. Hasło:<br><input type='password' name='password'><br>
  25. <input type='submit' value='Loguj'></div>";
  26. }
  27. }


Ta część kodu potrzebuje przebudowy.
1. utwórz sobie zmienne na login i hasło i w nich zrób zabiegi zabezpieczające:
  1. $login = htmlspecialchars(trim($_POST['login']));
  2. $pass = md5(htmlspecialchars($_POST['password']));


2. Ulepszmy zapytanie:
  1. $result=mysql_query("SELECT * FROM admin WHERE login='".$login."' AND password='".$pass."' LIMIT 1");
  2. $row=mysql_fetch_array($result);


3. Warunek isset($row) jest trochę wątpliwy. Ja bym dał:
  1. if(mysql_num_rows($result) == 1)


4. Nie dawaj potencjalnemu włamywaczowi za dużo informacji. Mówienie mu że podał dobry login ale hasło nie jest luką w bezpieczeństwie. Jeden komunikat typu "Błędne dane" w zupełności wystarczy.

I w tym momencie już wiem że dany użytkownik jest w bazie więc więcej nic nie musimy sprawdzać. Tak więc sklejmy teraz ten fragment do do kupy:
  1. $login = htmlspecialchars(trim($_POST['login']));
  2. $pass = md5(htmlspecialchars($_POST['password']));
  3.  
  4. $result=mysql_query("SELECT * FROM admin WHERE login='".$login."' AND password='".$pass."' LIMIT 1");
  5. $row=mysql_fetch_array($result);
  6.  
  7. if(mysql_num_rows($result) == 1) {
  8. $_SESSION['user']=$row['id'];
  9. header ("location: main.php");
  10. } else {
  11. echo "<div id='loginbox'><span>Błędne dane</span><br>
  12. <form action='' method='post'>
  13. Login:<br><input type='text' name='login'><br>
  14. Hasło:<br><input type='password' name='password'><br>
  15. <input type='submit' value='Loguj'></div>";
  16. }

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.