なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策18】ログイン処理を正しく実装する
言うまでもなくログイン処理はセキュリティ上最も重要な処理です。しかし,
ログインページがスクリプトインジェクションに脆弱であるのは論外であるとしても,
Webサイトによってはログインした後,
すべてのWebアプリケーションは少なくとも最後に何時のどのIPアドレス
自動ログインは正しく実装されていないアプリケーションが非常に多いです。
決してユーザ名とパスワードをハッシュ化した値などを自動ログイン用の鍵に使用してはなりません。笑いごとのように思われるかも知れませんが,
Webサーバが標準でサポートしていることが多いBASIC認証はBASE64でエンコードしたユーザ名とパスワードをリクエストの度に送信しています。このことからも分かるようにBASIC認証は非常に危険な認証方式です。通常は使用してはならない認証方式であることを覚えておいてください。
固定化した自動ログインキーを採用しているシステムは,
盗聴などによりパスワードが漏洩してしまうと,
チャレンジレスポンス認証のフロー
- サーバ側で毎回ランダムに設定されたチャレンジ文字列
(これも通常はランダム文字列のSHA1ハッシュなどを利用する) をクライアントに送信する - クライアント側でJavaScriptが有効な場合,
ユーザが入力したパスワードとチャレンジ文字列のハッシュ値 (SHA1など。この値がレスポンスとなる) を計算し, この値をログインフォーム送信時に送信する。このとき, 平文のパスワードを送信してしまうと意味がないので平文のパスワードは送信しないようにする - サーバ側でパスワード値とチャレンジ文字列のハッシュ値を計算し,
クライアントから送信されたレスポンスと比較する。一致した場合はユーザが正しいパスワードを入力したことを意味し, 異なる場合は間違ったパスワードを入力したことが分かる
この方法はJavaScriptが有効なブラウザでなければ利用できないので,
多くのWebサーバがサポートしているDIGEST認証もチャレンジレスポンス型の認証方式です。BASIC認証に比べるとかなり安全性は向上していますが,
対策のまとめ
- ログインしたら新しいセッションIDを発行する
- ログオフしたらセッションを破棄する
- 前回のログインIPや時間を表示する
- セキュリティを重視するなら自動ログインは実装しない
- ログイン中のセッションの有効期限は短くする
- セッションIDをCSRF対策に利用しない
- セッションIDの管理を正しく行う
- ログインページにはHTTPSプロトコルを利用する
- チャレンジレスポンス型の認証を行う
この記事に関連する書籍
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...
バックナンバー
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する