セッションの乗っ取り(ハイジャック)対策をする必要がある。
①チェック済みのセッションか?
②HTTP_ACCEPT_CHARSETとHTTP_USER_AGENTのチェック
セッション開始
session_start();
if (
!isset($_SESSION[‘_SESSION_CHECK’]) || ($_SESSION[‘_SESSION_CHECK’][‘HTTP_USER_AGENT’] != $_SERVER[‘HTTP_USER_AGENT’]) || ($_SESSION[‘_SESSION_CHECK’][‘HTTP_ACCEPT_CHARSET’] != $_SERVER[‘HTTP_ACCEPT_CHARSET’]))
{
session_start();
session_destroy();
session_id(md5(uniqid(rand(), true)));
session_start();
$_SESSION[‘_SESSION_CHECK’] = array(
‘HTTP_USER_AGENT’ => $_SERVER[‘HTTP_USER_AGENT’],
‘HTTP_ACCEPT_CHARSET’ => $_SERVER[‘HTTP_ACCEPT_CHARSET’],
‘startTime’ => time(),
);
}
セッション終了
// セッション変数を全て解除。
$_SESSION = array();
// セッションファイルを削除する場合のみ。
$session_id = session_id();
if ( preg_match( ‘/^[-,0-9a-fA-Z]+$/D’, $session_id ) ) {
$session_file = session_save_path() . ‘/sess_’ . $session_id;
if ( is_file( $session_file ) ) {
unlink( $session_file );
}
}
// セッションクッキーの削除。
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), ”, time()-42000, ‘/’);
}
//セッションを破壊する。
session_destroy();
クッキーパラメーター
共用サーバーの場合はクッキーパラメーターを指定する必要があります。そうしないとセッション用のクッキーが同一サバー内のサイトでも利用されてしまいます。
session_set_cookie_params( 1000, ‘/directory/’ );
session_start();
タイムアウト対策
タイムアウト対策として、セッション生存期間を長くする方法はセッションハイジャックのリスクが高まります。そこで、定期的にリフレッシュするという方法で対処する。
Session Fixation攻撃・セッション固定攻撃
PHPではセッションIDを利用者が指定することが可能で、第3者に指定IDを利用させることで問題を起こす。
<対策>
・ログインした時点でセッションIDを変更する。
・できるだけセッションはクッキーを使用する。