Невозможно предотвратить перехват сеанса на 100%, но с помощью некоторого подхода мы можем сократить время, которое злоумышленник может перехватить.
Метод предотвращения перехвата сеанса:
1 - всегда использовать сессию с ssl-сертификатом;
2 - отправлять cookie сеанса только с httponly, установленным в true (запретить javascript доступ к cookie сеанса)
2 - используйте идентификатор регенерации сеанса при входе в систему и выходе из системы (примечание: не используйте регенерацию сеанса при каждом запросе, потому что, если у вас есть последовательный запрос ajax, у вас есть возможность создать несколько сеансов.)
3 - установить тайм-аут сеанса
4 - сохранять пользовательский агент браузера в переменной $ _SESSION для сравнения с $ _SERVER ['HTTP_USER_AGENT'] при каждом запросе
5 - установите токен cookie и установите время истечения срока действия этого cookie равным 0 (до закрытия браузера). Регенерируйте значение cookie для каждого запроса. (Для запроса ajax не создавайте повторно файл cookie токена). EX:
//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');
}
примечание: не создавайте повторно cookie токена с помощью запроса ajax примечание: приведенный выше код является примером. примечание: если пользователи выходят из системы, токен cookie должен быть уничтожен, а также сеанс
6 - использование IP-адреса пользователя для предотвращения перехвата сеанса - не лучший способ, потому что IP-адрес некоторых пользователей меняется с каждым запросом. КОТОРЫЕ ВЛИЯЮТ НА ДЕЙСТВИТЕЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ
7 - лично я храню данные сеанса в базе данных, выбор метода зависит от вас.
Если вы обнаружите ошибку в моем подходе, пожалуйста, поправьте меня. Если у вас есть другие способы предотвратить хиджак во время сеанса, пожалуйста, сообщите мне.