Немає можливості запобігти викрадення сеансу на 100%, але при певному підході ми можемо скоротити час, коли зловмисник захопить сеанс.
Спосіб запобігання викрадення сеансу:
1 - завжди використовувати сеанс із сертифікатом ssl;
2 - надсилати файли cookie сеансу лише із httpsly, встановленою на true (запобігати JavaScript для доступу до файлу cookie сеансу)
2 - використовувати ідентифікатор відновлення сеансу при вході та виході (зверніть увагу: не використовуйте для відновлення сеансу при кожному запиті, тому що якщо у вас є послідовний запит ajax, ви маєте шанс створити кілька сеансів.)
3 - встановити тайм-аут сеансу
4 - зберігайте агент користувача браузера у змінній $ _SESSION порівняння з $ _SERVER ['HTTP_USER_AGENT'] при кожному запиті
5 - встановіть 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 - я особисто зберігаю дані сеансу в базі даних, саме від вас залежить, який метод ви застосуєте
Якщо ви виявите помилку в моєму підході, будь ласка, виправте мене. Якщо у вас є більше способів запобігти сеансовому походженню, будь ласка, скажіть мені.