会員機能を持つWebアプリケーションのログインフォームにおいて、以下のようなエラーメッセージは良くないとされている。
- 指定したユーザーIDは存在しません
- パスワードが間違っています
IDとパスワードのどちらが間違っているかを丁寧に知らせることで、攻撃者による総当たり攻撃がやりやすくなってしまうためだ。
なぜどちらが間違いか分かるといけないのか
IDとパスワードの組み合わせをそれぞれ1万パターンとして考えた場合を例にしよう。
まず、IDを全て試したところ、9999回「指定したユーザーIDは存在しません」とエラーメッセージが表示され、最後の1万回目で「パスワードが間違っています」と表示されIDを特定できたとする。
この場合、あとは最大1万回パスワードのアタックを繰り返すだけで総当たり攻撃が成功してしまう。
ID、パスワード合わせ、たったの2万回のアタックで突破できてしまうことになる。
一方、「IDまたはパスワードが違います」とエラーメッセージが表示された場合、IDとパスワードの全ての組み合わせである1億パターン(1万×1万)を試す必要がある。
このようにエラーメッセージが少し変わるだけで、総当たり攻撃や辞書攻撃の効率がまったく変わってくるのだ。
アカウントロック機能が実装されている場合は?
この場合もエラーメッセージによっては、ログインIDの有無が分かってしまう場合がある。
アカウントロック機能が実装されている場合は、以下のようなエラーメッセージにすることがセキュリティ上好ましい。
「IDまたはパスワードが違うか、アカウントがロックされています」
ただしこの場合、正規ユーザーにとってもログイン失敗の原因がわからないという問題が発生するので、以下のような注意文を表示しておくと良いだろう。
※アカウントがロックされた場合は登録されたメールアドレスへ通知が届きますので、アカウントロックが疑わしい場合はまずメールをご確認ください。