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:
<?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) {
Header("Location: a_panel.php"); }
}
// 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) {
Header("Location: a_panel.php"); }
} 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 {
echo "<center><b>Bez modulu GD, logowanie jest niemożliwe !</b></center><br>"; }
}
// 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
Header("Location: index.php"); }
?>
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