■セッションフィクセーション
セッションのIDを固定化させる方法である。特定のリンクを第三者にクリックさせ任意のセッションIDを付加させる方法である。これにより、攻撃者は第三者のセッションIDを知ることができてしまう。
対策
まず、「php.ini」の「session.use_only_cookies」を「On」にする。
session.use_only_cookies = On
以下のように、session_start()の後すぐに、session_regenerate_id(true)関数を呼び出す。この関数は、Set-Cookieヘッダーを再度送信し、セッションIDを新しいものに置き換える。但し、デフォルトでは古いセッションファイルを削除しないため、そこまでのセッションデータは古いIDでも取り出すことができてしまう。PHP5.1以降では引数に「true」を設定することで、古いセッションファイルを削除することができる。
<?php session_start(); session_regenerate_id(true); ?>
但し、一番初めのアクセスはIDを新しくする必要もないので、以下のようにする。
<?php session_start(); if(!isset($_SESSION['init'])){ session_regenerate_id(true); $_SESSION['init'] = true; } ?>
■セッションハイジャック
対策1
以下のように、一つ前のリクエストと今回のリクエストのUSER AGENTを調べる。これは、リクエスト毎にブラウザがかわることはない、という前提を利用したチェック方法である。
<?php if($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['user_agent']){ exit; } ?>
重要
但し、ネットワークの盗聴などをされるとPHPでは防ぎきれないので、完全にセッションハイジャックを防ぎたい場合は、HTTPS通信にしてクッキーにセキュア属性を付加する。