Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: system logowania z uzyciem sesji, no i problemik :)
Forum PHP.pl > Forum > PHP
uho
Witam,

Do wlasnego cmsika dorobilem system autoryzacji. Wszystko jest ok, ale system ma powazna luke.
Logowanie jest oparte na bazie mysql i zapisaniu identyfikatora uzytkownika do zmiennej sesyjnej.
Majac kilka stron na jednym serwerze opartych na tym samym cmsie, luka w autoryzacji ujawnia sie gdy, logujac sie z tego samego komputera do jednej strony mam dostep do panelu admina we wszystkich pozostalych stronach.

oto fragment kodu pliki autoryzujacego:
  1. <?php 
  2. // obsluga bazy sql
  3. require_once("../sql.php");
  4. $dbi = sql_connect($dbhost, $dbuname, $dbpass, $dbname);
  5.  
  6. // przepuszczanie loginu, hasla i kodu metoda POST
  7. $login = $_POST['login'];
  8. $haslo = $_POST['haslo'];
  9. $f_kod = $_POST['f_kod'];
  10.  
  11. // aktywacja buforowania przed przetworzeniem,
  12. // rozwiazanie problemow z naglowkami HTML
  13.  
  14. // start sesji do zapisania identyfikatora uzytkownika
  15.  
  16. // sprawdzenie czy zmienna sesyjna zostala juz zapisana jesli tak, 
  17. // nastepuje przejscie do odpowiednich lokacji
  18. // zapobieganie sytuacjom ponownego wejscia na adres strony do logowania 
  19. // gdy uzytkownik jest juz zalogowany
  20. if (session_is_registered("s_uid")) {
  21. $uid = $_SESSION["s_uid"];
  22. if ($uid == 1) {
  23. Header("Location: a_panel.php");
  24. }
  25. }
  26.  
  27. // funkcja sprawdzajaca prawidlowe zalogowanie, 
  28. // zwracajaca identyfikator uzytkownika uid
  29. function logowanie($login, $haslo) {
  30. global $dbi;
  31. $result = sql_query("SELECT uid FROM users WHERE login='$login' AND password=old_password('$haslo') AND active='1'", $dbi);
  32. list($uid) = sql_fetch_row($result, $dbi);
  33. return $uid;
  34. }
  35.  
  36. // rozpoczecie strony do logowania
  37. #
  38. # tutaj znajduje sie naglowek strony html
  39. #
  40.  
  41. // jesli zmienne istnieja sprobuj zalogowac
  42. if (isset($login) and isset($haslo) and isset($f_kod)) {
  43. // prawda jesli funkcja zwroci identyfikator 
  44. //i kod bedzie sie zgadzac z zapisanym w sesji,
  45. // trzeci warunek zapobiega logowaniu 
  46. // z wylaczona obsluga obrazkow w przegladarkach
  47. if (logowanie($login,$haslo) and $_SESSION["kod"] == $f_kod and session_is_registered("kod")) {
  48. sleep(1);
  49. // rejestracja zmiennej sesyjnej
  50. $s_uid = logowanie($login,$haslo);
  51. session_register("s_uid");
  52. // przejscie do odpowiedniego modulu w zaleznosci od uzytkownika
  53. if ($s_uid) {
  54. Header("Location: a_panel.php");
  55. }
  56. } else {
  57. sleep(5);
  58. echo "<center><b>Logowanie nie powiodło się !</b><br><br>
  59. <a href="index.php">[ wróć ]</center></a></center><br>";
  60. }
  61. // jesli zmienne nie istnieja wyswietl formularz logowania
  62. } else {
  63. // sprawdzanie czy rozszezenie GD jest zaladowane
  64. if (extension_loaded("gd")) {
  65. #
  66. # tutaj znajduje sie formularz do logowania
  67. #
  68. } else {
  69. echo "<center><b>Bez modulu GD, logowanie jest niemożliwe !</b></center><br>";
  70. }
  71. }
  72. // stopka
  73. #
  74. # tutaj znajduje sie stropka storny html
  75. #
  76.  
  77. // wyzwalanie buforowania
  78. ?>


w kazdym pliku panelu admina jest na poczatku cos takiego:
  1. <?php
  2. // sprawdzanie czy user jest zalogowany
  3. if (!session_is_registered("s_uid")) {
  4. Header("Location: index.php");
  5. }
  6. ?>


poprzez to ze laczac sie w ten sposob ze stronami na jednym serwerze, mam ten sam numer sesji i dane z sesji sa dostepne dla wszystkich tych stron.

moje pytanie dotyczy tego, jaki dodatkowy warunek dodac w tym systemie logowania, zeby tej luce zapobiec ?

dzieki za wszelkie podpowiedzi
bigZbig
Przede wszystkim zadbaj aby pliki sesyjne nie byly przechowywane w domyslnej lokalizacji. Kazdy z twoich cmsow powiniem przechowywac pliki sesyjne w innym katalogu (session_save_path()). Moze sie myle ale to powinno rozwiazac Twoj problem
athabus
może sprawdź adres/katalog pod jakim jest user . jeśli np. www.mojastroan1.pl to tylko dostęp do tego panelu

Możesz też np dodać jakąś stałą - dla każdego serwisu inną - i sprawdzać czy stała się zgadza

Możesz też mieć inną nazwę zmiennej sesji dla każdego serwisu/skorzystać z tablicy itp itd
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.