アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » なぜPHPアプリにセキュリティホールが多いのか? » 補講 » 【スクリプトインジェクション対策18】ログイン処理を正しく実装する

なぜPHPアプリにセキュリティホールが多いのか?

【スクリプトインジェクション対策18】ログイン処理を正しく実装する

言うまでもなくログイン処理はセキュリティ上最も重要な処理です。しかし,ログイン処理が正しく行われていないサイトも少なくありません。例えば,PayPalのログインページがスクリプトインジェクションに脆弱であったことは有名です。ログインページがスクリプトインジェクションに脆弱であると,簡単にユーザ名とパスワードを盗めてしまいます。PayPalのログインページはHTTPSで保護されていましたが,スクリプトインジェクションに脆弱ではHTTPSは何の役にも立ちません。

ログインページがスクリプトインジェクションに脆弱であるのは論外であるとしても,ログインの実装方法が正しくない場合が少なくありません。ログインに成功した場合,新しいセッションIDを割り当てるべきです。これは,「セッションIDを頻繁に変更する」のエントリでも解説したように,セッションIDの盗聴や固定化などから防御するために行います。

Webサイトによってはログインした後,どこでログオフすればよいのか分かり難いサイトもあります。安全性を重視するならサイトの利用が終わったらすぐにログオフしたほうがよいです。ログインしたままのユーザが多いからといってログオフの機能を実装しなかったり,分かり難い場所にログオフ用のリンク/ボタンを配置するのは好ましくありません。言うまでもなくログオフしたらセッションIDとセッション情報は破棄し,必要であれば新しいセッションIDを割り当てます。

すべてのWebアプリケーションは少なくとも最後に何時のどのIPアドレス(できればDNSを逆引きも行いホスト名も)からログインしたか確認できるようにすべきです。この機能を実装するだけで軽い悪戯目的の成りすましを思いとどまらせることが可能となる確率が高まります。ユーザ自身が不正ログインに気付けば,パスワードの変更やデータ改ざんの確認等,適切な対応を行える確率も高くなります。セキュリティが重要なWebアプリケーションでは過去数回のログイン履歴も参照できるようにするとよりよいでしょう。

自動ログインは正しく実装されていないアプリケーションが非常に多いです。「自動ログインを実装しない。実装する場合は正しく実装する」でも解説したとおり,自動ログインを実装する場合,自動ログイン用の鍵となるクッキーをパス付きで保管すべきです。鍵には必ず十分に長いランダムな文字列(/dev/urandomを利用したSHA1ハッシュなど)を利用し,ログインのたびに新しい鍵を設定します。一度使った鍵は無効となるようにデータベース等から削除します。

決してユーザ名とパスワードをハッシュ化した値などを自動ログイン用の鍵に使用してはなりません。笑いごとのように思われるかも知れませんが,過去にはBASE64でエンコードしたユーザ名とパスワードを自動ログイン用の鍵に設定していたWebアプリケーションもありました。BASE64は可逆変換可能なエンコード方式なので平文と変わりません。

Webサーバが標準でサポートしていることが多いBASIC認証はBASE64でエンコードしたユーザ名とパスワードをリクエストの度に送信しています。このことからも分かるようにBASIC認証は非常に危険な認証方式です。通常は使用してはならない認証方式であることを覚えておいてください。

固定化した自動ログインキーを採用しているシステムは,セッションIDが固定化しているよりも脆弱です。固定や固定に近い自動ログインキーは絶対に使用してはなりません。必ずランダム文字列ソース(/dev/urandom等)からSHA1ハッシュ値等を取得してその値を利用します。

盗聴などによりパスワードが漏洩してしまうと,そのアカウントが長期間不正利用される可能性があります。JavaScriptが有効なクライアントであれば,平文のパスワードを送信するのではなく,平文のパスワードがネットワーク上に流れないチャレンジレスポンス型の認証を行ったほうが安全です。HTTPSプロトコルが利用できる場合はHTTPSプロトコルを利用したほうがより安全であることには言うまでもありません。

チャレンジレスポンス認証のフロー
  1. サーバ側で毎回ランダムに設定されたチャレンジ文字列(これも通常はランダム文字列のSHA1ハッシュなどを利用する)をクライアントに送信する
  2. クライアント側でJavaScriptが有効な場合,ユーザが入力したパスワードとチャレンジ文字列のハッシュ値(SHA1など。この値がレスポンスとなる)を計算し,この値をログインフォーム送信時に送信する。このとき,平文のパスワードを送信してしまうと意味がないので平文のパスワードは送信しないようにする
  3. サーバ側でパスワード値とチャレンジ文字列のハッシュ値を計算し,クライアントから送信されたレスポンスと比較する。一致した場合はユーザが正しいパスワードを入力したことを意味し,異なる場合は間違ったパスワードを入力したことが分かる

この方法はJavaScriptが有効なブラウザでなければ利用できないので,JavaScriptが無効なブラウザでは平文のパスワードが利用できるように作っておくとよりよいでしょう。

多くのWebサーバがサポートしているDIGEST認証もチャレンジレスポンス型の認証方式です。BASIC認証に比べるとかなり安全性は向上していますが,ログオフが正式に規定されていない,ログイン画面を自由に制御できない,クッキーを利用したセッション管理のようにセッションIDの更新ができないなど問題も多いので本格的なWebアプリケーションでは利用されません。

対策のまとめ

  • ログインしたら新しいセッションIDを発行する
  • ログオフしたらセッションを破棄する
  • 前回のログインIPや時間を表示する
  • セキュリティを重視するなら自動ログインは実装しない
  • ログイン中のセッションの有効期限は短くする
  • セッションIDをCSRF対策に利用しない
  • セッションIDの管理を正しく行う
  • ログインページにはHTTPSプロトコルを利用する
  • チャレンジレスポンス型の認証を行う

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

  • Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

    Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?

  • [改訂版]PHPポケットリファレンス

    [改訂版]PHPポケットリファレンス

トラックバック

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス