napisałem sobie proste logowanie. Zależy mi na bezpieczeństwie więc wykorzystałem zarówno sesje jak i ciasteczka
Chciałbym, aby sprawdziła to osoba znająca się na rzeczy. Czy escape_string jest tam gdzie trzeba, czy musi być gdzieś jeszcze, itp.
Jeśli wszystko gra to - użytkownicy forum - macie darmowego gotowca :] Ale niech ktoś wiarygodny to potwierdzi…
index.php (z formularzem logowania)
<?php
session_start();
if (isset($_POST['logowanie'])) {
$login = mysql_escape_string($_POST['login']);
$haslo = sha1($_POST['haslo']); //przykladowehaslo
if ($login == 'admin' and $haslo == 'de19afa25e0ff01e4acc6a2e9d377f62417829fa') {
$_SESSION['login'] = 1;
$_SESSION['PHPSESSID'] = session_id();
setcookie('login', 1);
// PHPSESSID samo się robi
header("Location: news_show.php");
}
}
?>
...
formularz logowania
...
news_show.php (dostęp tutaj tylko po zalogowaniu)
<?php
session_start();
if($_SESSION['login']!=1 or $_COOKIE['login']!=1 or $_SESSION['PHPSESSID']!=$_COOKIE['PHPSESSID']) {
header("Location: index.php");
exit;
}
?>
...
Wywnioskowałem, że sprawdzanie warunku $_SESSION[‘PHPSESSID’]!=$_COOKIE[‘PHPSESSID’] uniemożliwia w tym przypadku dostęp komuś, komu poda się link z id sesji do danej strony. Mam rację?
Jednym z najpewniejszych sposobów upewnienia się, że ktoś nie wejdzie z SESSION ID zalogowanego użytkownika jest zapisanie w sesji adresu IP przy logowaniu i później sprawdzanie przy przeglądaniu strony (przynajmniej przy tych krytycznych akcjach) czy aktualne IP zgadza się z tym zapisanym.
A nie zabezpiecza mnie przed tym porównanie PHPSESSID z ciasteczka i z sesji? Sesji chyba nie da się oszukać, no przynajmniej nie słyszałem żeby można było utworzyć sobie sesję o danym id…
Z przypisywaniem IP to extra rozwiązanie, ale co w takim przypadku: internet z kablówki, całe osiedle jest za NATem (każdy ma wewnętrzne IP) i około 80 komputerów przedstawia się w necie jako ten sam ZEWnętrzny adres.
Gdzieś natknąłem się na pomysł porównywania id sesji z cookie i z… sesji bo w ciachu id robi się samo już podczas session_start() - nie jest ono zapisywane w $_SESSION tylko jako ciasteczko. Stąd pomysł porównywania… ale teraz już wątpiłem czy to ma jakikolwiek sens :?
Wiem, w którym miejscu jest problem ale nie mam pojęcia jak to rozwiązać - jakaś wskazówka?
– edit –
ale zaraz, zaraz… Przecież jeśli warunek, o którym piszesz, będzie spełniony to… zobacz do mojego pierwszego postu, co się stanie Przeniesie użytkownika na stronę logowania i zakończy wykonywanie skryptu przez exit()