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_id
(Accounts.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/です。
驚くような応答!それはとても役に立ちます。ありがとうございました! – Andrew
私の唯一の他の質問は...私はGUIDの乱数を生成する必要がありますか?それで、私はそのことをどうやってやっていくのかという私の元の質問に私を戻してくれますか?また、GUIDがデータベース内で一意であることを強制するにはどうすればよいですか? – Andrew
uniqid()関数を使用してPHPでUUIDを生成する:http://php.net/uniqid –