メールでユーザーのパスワードをリセットするための通常のフローは次のとおりです。
- ランダムな文字列を生成し、データベーステーブルに保存します
- ユーザーへのメール文字列
- ユーザーが文字列を含むリンクをクリックする
- 文字列はデータベースに対して検証されます。一致する場合、ユーザーのpwはリセットされます
ただし、テーブルを維持したり、古い文字列を期限切れにしたりすることは、少し面倒なことのように思えます。この代替アプローチに明らかな欠陥はありますか?
- ユーザーの既存のパスワードのMD5ハッシュを生成します
- ハッシュ文字列をユーザーにメールで送信
- ユーザーが文字列を含むリンクをクリックする
- 文字列は、既存のpwを再度ハッシュすることによって検証されます。一致する場合、ユーザーのpwはリセットされます
ユーザーのパスワードはすでにハッシュ化およびソルト化された形式で保存されていることに注意してください。一意であるが繰り返し可能な文字列を取得するために、もう一度パスワードをハッシュ化しています。
そして、はい、明らかな「欠陥」が1つあります。このように生成されたリセットリンクは、ユーザーがパスワードを変更する(リンクをクリックする)まで期限切れになりません。しかし、なぜこれが問題になるのかはよくわかりません。メールボックスが危険にさらされた場合、ユーザーはとにかく困惑します。また、ユーザーのパスワードが変更されると、リセットリンクが一致しなくなるため、再利用のリスクはありません。