なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策04】不正なセッションIDの利用がないか記録する
この記事を読むのに必要な時間:およそ 0.5 分
デフォルトの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アドレスの所有者情報などを利用して不正利用の可能性がある利用者ログを作成する
- 上位ドメインのクッキーを削除してもよい場合は削除する
- ※1
- セッションアダプション(Session Adoption)と呼ばれる脆弱性
- ※2
- セッションアダプション問題の危険性はPHPの開発者に正しく理解されていないと思われます。この問題については別の記事で解説します。
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...

