Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2015年3月15日
最終更新日:2015年3月21日

安全なログインとパスワードの実装方法

はじめに

最近は、IPAが無料で公開している「安全なウェブサイトの作り方」や、書籍の「体系的に学ぶ 安全なWebアプリケーションの作り方」のおかげで、Web アプリケーションをどのように作れば安全になるかという情報が手に入りやすくなりました。

一方で、「じゃあ、具体的にどうするの?」となったとき、ネットで調べても断片的な情報しか入手できません。特に、ログインやパスワードの実装方法についてのまとまった情報がなかなか見つかりません。

当記事では、ユーザー登録からログイン、パスワードの変更、パスワードのリセットといった具体的な処理を、PHP + MDB2 + MySQL での実装方法を紹介します。

PDO ではなく MDB2 を採用しているのは、「体系的に学ぶ 安全なWebアプリケーションの作り方」で MDB2 が推奨されているためです。

システム概要

サンプルシステムでは、以下の要件を満たすものとします。

■機能要件

以下の機能を実装します。

  • ログイン機能
    • ID とパスワードでログインできる
    • リセットフラグが立てられた時は、パスワードリセット機能へ強制遷移
  • 新規登録機能
    • ID、パスワード、メールアドレスを登録できる
    • 登録は仮登録で、メールで送信されるアドレスをクリックすることで正式登録となる
  • パスワードリセット機能
    • ID を登録すると、登録済みメールアドレスにリセット用アドレスを送信する
    • リセット画面で新規パスワードを設定する
    • リセット後、リセット通知メールを登録済みメールアドレスに送信する
  • パスワード変更機能
    • ログイン後にパスワード変更機能を利用できる
    • 旧パスワードと新パスワードを入力することで新パスワードを設定できる
    • パスワード変更後、パスワード変更通知メールを登録済みメールアドレスに送信する

■セキュリティ要件

以下のセキュリティ要件を満たすものとします。

  • パスワード強度通知
    • パスワード登録時、パスワードの強度をリアルタイムに通知
    • パスワード強度が弱い場合は、警告メッセージを表示する
  • パスワード管理
    • パスワードはソルトとストレッチング処理を行い保存する
      • ソルトは8桁の乱数
      • ストレッチングは1000回
  • 通信の暗号化
    • システムは HTTPS で暗号化された通信で使用する
  • 脆弱性対策
    • クロスサイトスクリプティング対策
    • SQLインジェクション対策
    • クロスサイトリクエストフォージェリ(CSRF)対策
      • 必要な部分に実装する
    • メールヘッダーインジェクション対策

主要画面イメージ

主要な画面イメージには、以下のようになります。

■ログイン画面

ID とパスワードを入力することでログインできます。

Pic01

■登録画面

登録画面では、パスワードの強度がリアルタイムに表示されます。また、パスワードと確認用パスワードが異なる場合もリアルタイムにメッセージが表示されます。この仕組は、パスワード登録・変更機能に共通のものとなります。

Pic02

■ Welcome 画面

ログイン後に表示される画面です。

Pic03

■メール通知

メールでは、以下のように通知されます。

Pic04

テーブル設計

データベースは「Test」、テーブル名は「USERS」のみです。

「USERS」テーブルの設計は以下のようになります。

機能別部品一覧

機能別部品一覧は、以下のようになります。

Pic05

ソースコード

機能別のソースコードを掲載します。

共通部品

・function.php

・common.js

ログイン機能

・login.php

・login_check.php

・logout.php

・welcome.php

新規登録機能

・register.php

・register_check.php

・register_submit.php

・register_confirm.php

パスワードリセット機能

・password_reset.php

・password_reset_mail.php

・password_reset_url.php

・password_reset_submit.php

パスワード変更機能

・password_change.php

・password_change_submit.php

おわりに

駆け足で作成したので、突っ込みどころがあるとは思いますが、ログインやパスワード管理といった数少ない実装サンプルを提供できたのではないかと思います。

これがみなさんの Web アプリケーションを作成する際の参考になれば幸いです。

改訂履歴

・2015/03/21 微修正
・2015/03/20 主に XSS 対策を強化
・2015/03/19 更にリファクタリング
・2015/03/16 リファクタリング
・2015/03/15 投稿


スポンサーリンク




カテゴリー:ブログ

Twitter でも、いろんな情報を発信しています。


“安全なログインとパスワードの実装方法” への4件のフィードバック

  1. NOG より:

    PHPのDBアクセスはPDOに決まりだと思う理由、という記事を書かれていながらMDB2で実装されているのは何か意図があるのでしょうか?(PDO版を参考にしたく、期待しています)

    • fnya より:

      コメントが遅くなってすみません。
      単純に時期の問題ですね。
      この記事を書いたあとで、PDOの記事を書いたので。
      PDO版にすることは考えてなかったです。
      どうするか考えてみます。

  2. ロイド より:

    早速、テスト実装して参考にさせて頂きました。
    すごく勉強なります。
    ちなみにPDO版にしてみました。

    ありがとうございます。

コメントを残す