セッションのハイジャックを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のハイジャックを防ぐためにユーザーIPを使用するのは良い方法ではありません。有効なユーザーに影響する
7-個人的にセッションデータをデータベースに保存します。どの方法を採用するかはあなた次第です
私のアプローチに誤りを見つけた場合は修正してください。セッションのハイジャックを防ぐ方法が他にもある場合は、教えてください。