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:
<?php // obsluga bazy sql require_once("../sql.php"); $dbi = sql_connect($dbhost, $dbuname, $dbpass, $dbname); // przepuszczanie loginu, hasla i kodu metoda POST $login = $_POST['login']; $haslo = $_POST['haslo']; $f_kod = $_POST['f_kod']; // aktywacja buforowania przed przetworzeniem, // rozwiazanie problemow z naglowkami HTML // start sesji do zapisania identyfikatora uzytkownika // sprawdzenie czy zmienna sesyjna zostala juz zapisana jesli tak, // nastepuje przejscie do odpowiednich lokacji // zapobieganie sytuacjom ponownego wejscia na adres strony do logowania // gdy uzytkownik jest juz zalogowany $uid = $_SESSION["s_uid"]; if ($uid == 1) { } } // funkcja sprawdzajaca prawidlowe zalogowanie, // zwracajaca identyfikator uzytkownika uid function logowanie($login, $haslo) { $result = sql_query("SELECT uid FROM users WHERE login='$login' AND password=old_password('$haslo') AND active='1'", $dbi); list($uid) = sql_fetch_row($result, $dbi); return $uid; } // rozpoczecie strony do logowania # # tutaj znajduje sie naglowek strony html # // jesli zmienne istnieja sprobuj zalogowac // prawda jesli funkcja zwroci identyfikator //i kod bedzie sie zgadzac z zapisanym w sesji, // trzeci warunek zapobiega logowaniu // z wylaczona obsluga obrazkow w przegladarkach // rejestracja zmiennej sesyjnej $s_uid = logowanie($login,$haslo); // przejscie do odpowiedniego modulu w zaleznosci od uzytkownika if ($s_uid) { } } else { echo "<center><b>Logowanie nie powiodło się !</b><br><br> <a href="index.php">[ wróć ]</center></a></center><br>"; } // jesli zmienne nie istnieja wyswietl formularz logowania } else { // sprawdzanie czy rozszezenie GD jest zaladowane # # tutaj znajduje sie formularz do logowania # } else { } } // stopka # # tutaj znajduje sie stropka storny html # // wyzwalanie buforowania ?>
w kazdym pliku panelu admina jest na poczatku cos takiego:
<?php // sprawdzanie czy user jest zalogowany } ?>
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