2

Django を使用して Web アプリケーションを開発しています。

現在、「パスワードのリセットリンク」をメールで送信する作業を行っています (Amazon シンプルメールサービス - SES) 。

私が使用したメカニズムは、リンクの下の「simeonwillbanks」の回答と同じです

パスワードをリセットする、または古いパスワードを提供する安全な方法

  1. ユーザーにパスワードのリセット オプションを提供します。
  2. このオプションは、ユーザーの一意のトークンを保存します。トークンは最終的に期限切れになります (時間、日、または日)。
  3. トークンを含むリンクがユーザーに電子メールで送信されます。
  4. ユーザーが電子メールで送信されたリンクをクリックします。
  5. トークンが存在し、有効期限が切れていない場合、リンクは新しいパスワード フォームを読み込みます。そうでない場合は、新しいパスワード フォームを読み込まないでください。
  6. ユーザーが新しいパスワードを設定したら、トークンを削除し、確認メールをユーザーに送信します。

これについて私が心配しているのは、この方法がセキュリティの面で安全かどうかわかりません。電子メールがハッカーによってキャプチャされた場合はどうなりますか?

私はいくつかの主要な Web サイトで、彼らがこれをどのように気にかけているかをテストしました。

  1. 「パスワードのリセット」メールを受け取り、リンクをコピーします。
  2. 他の人にリンクを渡して、彼が私のアカウントのパスワードを変更できるかどうかを確認してください。

このテストから、他の誰かもリンクだけで私のパスワードを変更できることがわかりました。

リンクで何もできない場合、電子メールをより安全にする方法はありますか? Web サイトの ssl(https) の仕組みとしては?

ありがとう!

4

1 に答える 1

2

ユーザーの電子メールが侵害された場合は乾杯しますが、ある程度安全です.

私は、URL でHMACを使用することを好みます。これにより、トークンが DB に保存されるのを回避できます。

ユーザーの IP アドレスを URL と HMAC に含めると、リセット リンクのクリックが、リセットを要求したのと同じコンピューター (実際にはルーター) からのものであり、共有できないことを確認できます。

IP の代わりに、ユーザー名/電子メールと HMAC を使用してデバイス Cookieを設定し、電子メールからリセット リンクが届いたときにこれを確認できます。

ユーザーがリンクをクリックした後、システムは秘密の質問に対する答えをユーザーに尋ねる必要があります。さらに良いのは、短いランダム コードを含む SMS を彼の携帯電話に送信し、それを要求することです。これはhttps://en.wikipedia.org/wiki/Multi-factor_authenticationと呼ばれます

次に、パスワード変更フォームを表示します (もちろん HTTPS 経由で)。

ここでは、ユーザー列挙攻撃を避けるために、ユーザーがアカウントを持っているかどうかに関係なく、同じ「成功」メッセージを表示する必要があります。

また、localhost MTA リレーまたは非同期電子メールを使用して、電子メールを送信したかどうかをハッカーが判断できないようにします (応答が遅い場合は、ユーザーが存在することを示します)。

于 2015-08-20T02:55:34.380 に答える