Nie ma sposobu, aby zapobiec przejmowaniu sesji w 100%, ale przy pewnym podejściu możemy skrócić czas przechwytywania sesji przez atakującego.
Metoda zapobiegania przejmowaniu sesji:
1 - zawsze używaj sesji z certyfikatem ssl;
2 - wysyłaj plik cookie sesji tylko z ustawieniem httponly na wartość true (zapobiegaj dostępowi do plików cookie sesji przez javascript)
2 - użyj identyfikatora regeneracji sesji przy logowaniu i wylogowywaniu (uwaga: nie używaj regeneracji sesji przy każdym żądaniu, ponieważ jeśli masz kolejne żądanie Ajax, masz szansę na utworzenie wielu sesji).
3 - ustaw limit czasu sesji
4 - zapisz klienta użytkownika przeglądarki w zmiennej $ _SESSION i porównaj z $ _SERVER ['HTTP_USER_AGENT'] przy każdym żądaniu
5 - ustaw plik cookie tokena i ustaw czas wygaśnięcia tego pliku cookie na 0 (do zamknięcia przeglądarki). Regeneruj wartość cookie dla każdego żądania (w przypadku żądania Ajax nie generuj ponownie pliku cookie tokena). DAWNY:
//set a token cookie if one not exist
if(!isset($_COOKIE['user_token'])){
//generate a random string for cookie value
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
//set a session variable with that random string
$_SESSION['user_token'] = $cookie_token;
//set cookie with rand value
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}
//set a sesison variable with request of www.example.com
if(!isset($_SESSION['request'])){
$_SESSION['request'] = -1;
}
//increment $_SESSION['request'] with 1 for each request at www.example.com
$_SESSION['request']++;
//verify if $_SESSION['user_token'] it's equal with $_COOKIE['user_token'] only for $_SESSION['request'] > 0
if($_SESSION['request'] > 0){
// if it's equal then regenerete value of token cookie if not then destroy_session
if($_SESSION['user_token'] === $_COOKIE['user_token']){
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
$_SESSION['user_token'] = $cookie_token;
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}else{
//code for session_destroy
}
}
//prevent session hijaking with browser user agent
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']){
die('session hijaking - user agent');
}
uwaga: nie generuj ponownie pliku cookie tokena za pomocą żądania Ajax uwaga: powyższy kod jest przykładem. uwaga: jeśli użytkownicy wylogują się, token cookie musi zostać zniszczony, podobnie jak sesja
6 - nie jest dobrym podejściem używanie adresu IP użytkownika do zapobiegania przejmowaniu sesji, ponieważ niektórzy użytkownicy zmieniają adresy IP przy każdym żądaniu. KTÓRE WPŁYWAJĄ NA WAŻNYCH UŻYTKOWNIKÓW
7 - osobiście przechowuję dane sesji w bazie danych, od Ciebie zależy jaką metodę zastosujesz
Jeśli zauważysz błąd w moim podejściu, popraw mnie. Jeśli masz więcej sposobów na zapobieganie hyjakowi podczas sesji, powiedz mi.