ほとんどのパスワードリセットシステムでは、パスワードをリセットできる1回限りのリンクをユーザーにメールで送信します。ほとんどのメールクライアントはHTMLメールがPOSTリクエストを実行することを許可していないため、トークンをURLに含める必要があり、ユーザーにトークンの再入力を求めることは許容できるエクスペリエンスではありません。ただし、これによりリファラーヘッダーからの漏洩のリスクがあるトークン。
これに対する1つの潜在的な解決策は、パスワードリセットページの外部リンクを回避することです。ただし、ほとんどのサイトには外部リンク(Facebook、Twitterなど)を含む標準テンプレートがあり、このテンプレートを使用しないとページが奇妙に見え、ユーザーをフィッシングサイトであると思わせる可能性があります。
ブラウザーベンダーはこの問題を認識しており、 一部のブラウザー はメタリファラータグをサポートしているため、 "never"に設定してURLが漏洩することはありません。ただし、すべてのブラウザがこのタグをサポートしているわけではないため、完全なソリューションではありません。
では、このリークのないパスワードリセットプロセスを作成するにはどうすればよいでしょうか。
私が実際に使用しているのを見た最初のオプションは、まさにあなたが避けようとしているものです。トークンをURLに含めないでください。ただし、電子メールからコピーして、ページのisがリンクされているフォームフィールドに貼り付けるようにユーザーに指示してください。
それが許容できるユーザーエクスペリエンスではない場合は、代わりに、トークンを含むリンクを非インタラクティブインタースティシャルにすることをお勧めします。リンクは、URLからトークンを取り出し、それを別の場所に保存するリソースにユーザーを送信し(Cookie、セッション状態、あなたにとって有効なものなら何でも)、その後、ユーザーは実際のインタラクティブな「パスワードを忘れた」ページに転送されますURLにトークンがなくなった。この方法には、他のいくつかの回答(ページ読み込み時にトークンを無効にする)で提案されている方法よりも優れた利点があり、フォームが送信されるまで一定の期間、同じトークンを使い続けることができるため、ユーザーが忘れたり閉じたりした場合誤ってページを開いてしまった場合、新しいパスワードを忘れた場合のリクエストで最初からやり直す必要がなく、メールからプロセスを再入力するだけで済みます。
これが私のchrome設定のスクリーンショットです。
ブラウザが次のように動作することがわかります。
詳細はわかりませんが、ユーザーがページにアクセスする前に、またはWebサーバーが正しく構成されていない場合に、これらのサービスがトークンをリークすることを心配する必要があります。
<input type="hidden">
に含めます。そうすれば、リンクが危険にさらされていても、有効なCRSFトークンが必要です。SECRET_KEY
の値など)をオンラインにしないでください。これは1回限りのリンクであるため、元のトークンを無効にしてページで新しいトークンを生成し(フォームの非表示フィールドにします)、次にPOSTパスワードリセットフォームで。
また、電子メールリンクにユーザーIDを漏らす可能性がある追加情報を追加しないでください。パスワードのリセットプロセスを完了するには、SHA-256トークンで十分です。