なぜ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とは別に用意する(別のクッキーを利用する)
  • 自動ログイン用の鍵はログインするたびに更新する
  • 自動ログイン用の鍵はログイン処理するページ以外は送信されないようにする(クッキーのパスを設定する)
  • 自動ログイン用の鍵は必ずランダムな文字列だけを利用する
  • 自動ログイン用の鍵は使用されるたびに更新する(新しい鍵を発行し、古い鍵は無効にする)

おすすめ記事

記事・ニュース一覧