2009-04-16 13 views
7

Zend_Auth_Adapter_DbTableを使用する基本認証プロセスがあります。私は自分の認証コントローラにログインとログアウトのアクションを持っています。パスワードを自動的に生成し、新しいパスワードを保存し、新しく生成されたパスワードで電子メールを送信することによって、忘れたパスワードをリセットする機能を作成したいと考えています。Zend Frameworkのパスワードをリセットするためのランダムパスワードまたは一時URLの生成方法は?

これを行う最善のプロセスは何でしょうか?新しいパスワードを生成するにはどうすればよいですか? Zend Frameworkにはこれを簡単にするための何かがありますか?

私はまた、新しいパスワードを設定できる短期間のページへのリンク付きのメールを送信することについて聞いたことがあります。これはZend Frameworkでどのように行うことができますか?

答えて

22

Zend Frameworkにはパスワード生成クラスはありません。ここでパスワードを生成するPEARモジュールText_Passwordを使用する方法についての記事です: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118

しかし、それはプレーンな電子メールでパスワードを送信するために適切なセキュリティプラクティスではありません。代わりにパスワードを与えずに一時的にログインできるようにアカウントをリセットする必要があります(電子メールでURLを送信すると有効期限が切れます)。ログインすると、自分のパスワードをに更新する必要があります。次に、パスワードの塩漬けされたハッシュを保存します。


ここでZend Frameworkの中でこれを行うための私の頭の上からいくつかの提案があります:

  • フィールドを持つテーブルAccountResetを定義します。reset_id(GUID主キー)、account_idAccounts.account_id参照)、およびexpiration(タイムスタンプ)。
  • ユーザーが自分のアカウントをリセットすることを選択した場合は、とAccountResetテーブルに新しい行を挿入
  • など、つまりあなたは、アカウントを作成するログイン、パスワードの変更に使用するのと同じコントローラで、AccountController::resetAction()というアクションを実装新しいGUID、ユーザーのアカウントへの参照、および今後30分程度のexpiration
  • 「https .../account/reset/reset_id/< GUID >」というURLをクリックして、そのユーザーのファイル内のアドレスにメールを送信します(ルーティングルールを賢明に使うなら、そのURLを短縮することができますが、その中にGUIDを保持します)。
  • AccountController::resetAction()がリクエストを受信すると、テーブルのreset_idパラメータを検索します。 GUIDが存在し、時間が経過していない場合は、ユーザーにパスワードを変更するフォームを提示します(認証およびログインは必要ありません)。
  • resetAction()がGUIDのない要求を受け取った場合、またはGUIDがデータベースに存在しない場合、またはその行がexpirationを渡した場合、このアクションは代わりに新しいリセット要求を開始するボタンをユーザーに提示し、新しいGUIDで電子メールを送信します。このボタンをPOSTリクエストにすることを忘れないでください!

GUIDは電子メールでそのユーザーのアドレスにのみ伝達されるため、他のユーザーはパスワードを変更するアクセス権を取得できません。ユーザーの電子メールが傍受されても、GUIDがそのアクセスを許可する時間は限られています。

さらに慎重にしたい場合は、AccountResetテーブルにクライアントのIPアドレスを書き留めて、同じIPアドレスのクライアントからその30分のウィンドウ内でパスワードを変更する必要があります。

これは唯一の袖口であり、私はそれを実装していないか、適切なセキュリティのために評価しました。セキュリティの実装を担当する場合は、セキュリティ上の問題についてお読みください。 PHPセキュリティに関するよく知られたリソースはhttp://phpsecurity.org/です。

+0

驚くような応答!それはとても役に立ちます。ありがとうございました! – Andrew

+0

私の唯一の他の質問は...私はGUIDの乱数を生成する必要がありますか?それで、私はそのことをどうやってやっていくのかという私の元の質問に私を戻してくれますか?また、GUIDがデータベース内で一意であることを強制するにはどうすればよいですか? – Andrew

+2

uniqid()関数を使用してPHPでUUIDを生成する:http://php.net/uniqid –

関連する問題