デフォルトのPHPセッションモジュールは、未初期化のセッションIDが送信された場合、送信されてきたセッションIDを用いてHTTPセッションを初期化してしまう問題[1]があります。このため、不正なセッションIDの利用を記録するには独自のセッション管理の仕組みを利用しなければなりません。幸いPHPにはユーザ定義セッションセーフハンドラが利用できます[2]。
- session_set_save_handler関数
- bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
ユーザ定義セッションセーブハンドラであれば未初期化のセッションIDを検出することも可能です。
不正なセッションIDの利用を検出するためにIPアドレスが利用できるのではないかと考える方もいるかも知れません。しかし、残念ながらリクエストを送信してきたクライアントのIPアドレスは常に同じとは限りません。
- ダイアルアップ・公衆無線LANなどを利用し別のアクセスポイントからアクセスした場合
- 負荷分散のため、ゲートウェイやプロキシが複数設定されており利用するゲートウェイ・プロキシが動的に変更される場合
- Tor(トーア: 匿名性を保つためのネットワーク)などを利用した場合
身近な例では、携帯電話からWebサイトにアクセスする場合が挙げられます。携帯電話キャリアのプロキシプロキシサーバは複数台用意されているので、特定のIPアドレスからのアクセスは期待できません。しかし、携帯電話キャリアや大規模なネットワークで利用されるプロキシサーバなどのアドレスは頻繁に変更されません。不正アクセスの可能性がある接続をログし、これらの情報と併せて監視することによりいち早く問題を検出できるようになります。
対策のまとめ
- セッションアダプションに脆弱でないセッションセーブハンドラを作成する
- ソースIPアドレスの所有者情報などを利用して不正利用の可能性がある利用者ログを作成する
- 上位ドメインのクッキーを削除してもよい場合は削除する