なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策08】自動ログインを実装しない。実装する場合は正しく実装する
自動ログイン機能は便利ですが,セキュリティ上のリスクを確実に増加させます。安全性が重要なサイトでは自動ログイン機能は実装すべきではありません。
自動ログイン機能を実装する場合,正しく実装しなければなりません。
間違った自動ログインの実装方法
- セッションIDクッキーの有効期限を長くする
- 固定の自動ログイン鍵をクッキーに保存する
- 自動ログイン鍵をすべてのページで送信する
自動ログインの実装にはセッションID以外の予測不可能なランダム文字列を利用します。複数のWebブラウザから自動ログインできるようしたい場合,ユーザIDと自動ログイン鍵,その鍵の有効期限を保存したテーブルを作成して鍵を管理します。
正しい自動ログインの疑似コードは次のようになります。
//自動ログイン鍵が設定され,その鍵が有効化か?
if ($_COOKIE['auto_login_key'] &&
auto_login_key_is_valid()) {
update_auto_login_key(); // 自動ログイン鍵を更新
do_login(); // ログイン処理を行う
}
ログインするスクリプトが
http://example.jp/login/
に保存されている場合,自動ログイン鍵を保存したクッキーは/login/パスだけに送信されるように設定します。こうすることにより万が一パケットスニファなどで盗聴された場合でも,/login/以外のパスでは自動ログイン鍵を盗まれなくなります。自動ログイン鍵はセッションIDよりも長い時間有効な状態であるので,セッションIDよりさらに厳しい管理が必要です。
自動ログインを実装した場合,自動ログイン鍵の削除をおこなえるようにすべきです。ログアウト処理ですべての自動ログイン鍵を除削するようにするか,管理画面などで削除できるようにします。自動ログイン鍵が削除できるようにすれば,万が一ユーザが危険なネットワークやPCを利用したことが後で判明した場合に,自動ログイン鍵を削除できるようになります。
対策のまとめ
- 自動ログインが必要ない場合は実装しない
- セキュリティが重要なサイトでは自動ログインは実装しない
- セッション管理用のクッキーに有効期限を設定した疑似自動ログインを実装しない
- 自動ログイン用の鍵はセッションIDとは別に用意する(別のクッキーを利用する)
- 自動ログイン用の鍵はログインするたびに更新する
- 自動ログイン用の鍵はログイン処理するページ以外は送信されないようにする(クッキーのパスを設定する)
- 自動ログイン用の鍵は必ずランダムな文字列だけを利用する
- 自動ログイン用の鍵は使用されるたびに更新する(新しい鍵を発行し,古い鍵は無効にする)
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...

