セッションの乗っ取りを 100% 防止する方法はありませんが、攻撃者がセッションを乗っ取る時間を短縮する方法はいくつかあります。
セッションハイジャックを防ぐ方法:
1 - 常に SSL 証明書でセッションを使用します。
2 - httponly を true に設定してセッション Cookie のみを送信します (javascript がセッション Cookie にアクセスできないようにします)。
2 - ログインおよびログアウト時にセッション再生成 ID を使用します (注: 連続する ajax リクエストがある場合、複数のセッションを作成する機会があるため、各リクエストでセッション再生成を使用しないでください)。
3 - セッション タイムアウトを設定する
4 - ブラウザー ユーザー エージェントを $_SESSION 変数に格納し、各リクエストで $_SERVER['HTTP_USER_AGENT'] と比較します
5 - トークン Cookie を設定し、その Cookie の有効期限を 0 に設定します (ブラウザが閉じられるまで)。リクエストごとに Cookie 値を再生成します (ajax リクエストの場合、トークン Cookie を再生成しません)。元:
//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');
}
注: ajax リクエストでトークン Cookie を再生成しないでください 注: 上記のコードは一例です。注: ユーザーがログアウトする場合は、Cookie トークンとセッションを破棄する必要があります
6 - 一部のユーザーの IP はリクエストごとに変更されるため、セッションの乗っ取りを防ぐためにユーザーの IP を使用するのは適切なアプローチではありません。有効なユーザーに影響するもの
7 - 個人的にはセッションデータをデータベースに保存します。どの方法を採用するかはあなた次第です
私のアプローチに誤りがある場合は、修正してください。セッションのハイジャックを防ぐ方法が他にもある場合は、教えてください。