web-dev-qa-db-ja.com

パスワードのリセット中にリファラー情報の漏洩を回避する方法

ほとんどのパスワードリセットシステムでは、パスワードをリセットできる1回限りのリンクをユーザーにメールで送信します。ほとんどのメールクライアントはHTMLメールがPOSTリクエストを実行することを許可していないため、トークンをURLに含める必要があり、ユーザーにトークンの再入力を求めることは許容できるエクスペリエンスではありません。ただし、これによりリファラーヘッダーからの漏洩のリスクがあるトークン。

これに対する1つの潜在的な解決策は、パスワードリセットページの外部リンクを回避することです。ただし、ほとんどのサイトには外部リンク(Facebook、Twitterなど)を含む標準テンプレートがあり、このテンプレートを使用しないとページが奇妙に見え、ユーザーをフィッシングサイトであると思わせる可能性があります。

ブラウザーベンダーはこの問題を認識しており、 一部のブラウザー はメタリファラータグをサポートしているため、 "never"に設定してURLが漏洩することはありません。ただし、すべてのブラウザがこのタグをサポートしているわけではないため、完全なソリューションではありません。

では、このリークのないパスワードリセットプロセスを作成するにはどうすればよいでしょうか。

5
paj28

私が実際に使用しているのを見た最初のオプションは、まさにあなたが避けようとしているものです。トークンをURLに含めないでください。ただし、電子メールからコピーして、ページのisがリンクされているフォームフィールドに貼り付けるようにユーザーに指示してください。

それが許容できるユーザーエクスペリエンスではない場合は、代わりに、トークンを含むリンクを非インタラクティブインタースティシャルにすることをお勧めします。リンクは、URLからトークンを取り出し、それを別の場所に保存するリソースにユーザーを送信し(Cookie、セッション状態、あなたにとって有効なものなら何でも)、その後、ユーザーは実際のインタラクティブな「パスワードを忘れた」ページに転送されますURLにトークンがなくなった。この方法には、他のいくつかの回答(ページ読み込み時にトークンを無効にする)で提案されている方法よりも優れた利点があり、フォームが送信されるまで一定の期間、同じトークンを使い続けることができるため、ユーザーが忘れたり閉じたりした場合誤ってページを開いてしまった場合、新しいパスワードを忘れた場合のリクエストで最初からやり直す必要がなく、メールからプロセスを再入力するだけで済みます。

3
Xander

ブラウザからリンクが漏れていますか?

これが私のchrome設定のスクリーンショットです。

chrome settings

ブラウザが次のように動作することがわかります。

  • リンクが正当かどうかについて別のサービスに問い合わせる
  • リンクにエラーがある場合、別のサービスに問い合わせます

詳細はわかりませんが、ユーザーがページにアクセスする前に、またはWebサーバーが正しく構成されていない場合に、これらのサービスがトークンをリークすることを心配する必要があります。

パスワードリセットページ

  • リファラー情報をリンクしたくない場合は、リンクを含めないでください。
  • いくつかの影響を緩和したい場合は、強力な CRSFトークン<input type="hidden">に含めます。そうすれば、リンクが危険にさらされていても、有効なCRSFトークンが必要です。
    • なぜクッキーも必要ないのですか?
  • 万が一、githubを使用してウェブサイトのコードをホストしている場合は、構成(トークンの生成に使用されているSECRET_KEYの値など)をオンラインにしないでください。
3
dnozay

これは1回限りのリンクであるため、元のトークンを無効にしてページで新しいトークンを生成し(フォームの非表示フィールドにします)、次にPOSTパスワードリセットフォームで。

また、電子メールリンクにユーザーIDを漏らす可能性がある追加情報を追加しないでください。パスワードのリセットプロセスを完了するには、SHA-256トークンで十分です。

2
Alexander Lee