web-dev-qa-db-ja.com

Webサイトに「思い出せ」を実装するための最良の方法は何ですか?

自分のWebサイトにアクセスするたびにログインしなくても済むように、ユーザーがクリックできるチェックボックスを自分のWebサイトに設定します。これを実装するには、自分のコンピュータにクッキーを保存する必要があることを知っていますが、そのクッキーには何を含めるべきですか?

また、このCookieがセキュリティ上の脆弱性を提示するのを防ぐために注意を払うべき一般的な誤りはありますか。

486
Eddie Deyo

永続的ログインCookieのベストプラクティスの向上

ここで説明した この戦略をベストプラクティス (2006)または ここで説明した更新された戦略 (2015)として使用できます。

  1. ユーザーがRemember Meをチェックした状態で正常にログインすると、標準のセッション管理Cookieに加えてログインCookieが発行されますが表示されます。
  2. ログインCookieにはシリーズ識別子とトークンが含まれています。シリーズとトークンは、適切な大きさのスペースから推測不可能な乱数です。両方ともデータベーステーブルトークンはハッシュされます(sha256は問題ありません)にまとめて格納されます。
  3. ログインしていないユーザーがサイトにアクセスしてログインCookieを提示すると、シリーズIDはデータベース内で検索された。になります。
    1. シリーズ識別子が存在し、トークンのハッシュがそのシリーズ識別子のハッシュと一致する場合、ユーザーは認証済みと見なされます。 新しいトークンが生成され、トークンの新しいハッシュが古いレコードに格納され、新しいログインクッキーがユーザに発行されます(シリーズ識別子を再利用してもかまいません)。 _).
    2. 系列が存在するがトークンが一致しない場合は、盗難が想定されます。ユーザーには警告メッセージが強く表示され、記憶されているすべてのセッションが削除されます。
    3. ユーザ名とシリーズが存在しない場合、ログインクッキーは無視されますです。

このアプローチは、多層防御を提供します。誰かがデータベーステーブルを漏洩させたとしても、それは攻撃者になりすましのユーザーに対する門戸を開かせません。

512
splattne

ユーザーIDとトークンを保管します。ユーザーがサイトに戻ったら、これら2つの情報をデータベースエントリのような永続的なものと比較します。

セキュリティに関しては、誰かがクッキーを変更して追加の利益を得ることを可能にするようなものをそこに入れないでください。たとえば、自分のユーザーグループやパスワードを保存しないでください。セキュリティを回避するような変更が可能なものはすべてCookieに保存しないでください。

9
dragonmantank

自分のUserIdとRememberMeTokenを保存します。彼らがログインしたときに確認したことを確認すると、新しいRememberMeTokenが生成されます(マークされている他のマシンは無効になります)。

彼らが戻ってきたら、私を覚えているトークンでそれらを調べ、UserIdが一致することを確認してください。

7
jonnii

私自身が持続的セッションを調査したところ、セキュリティ上のリスクに見合う価値がないことがわかりました。絶対に必要な場合に使用してください。ただし、このようなセッションは認証が不十分であると見なし、攻撃者にとって価値があると思われるものはすべて新しいログインを強制する必要があります。

その理由はもちろん、あなたの持続的セッションを含むあなたのクッキーはとても簡単に盗まれるということです。

あなたのクッキーを盗む4つの方法(からの@splattneページの Jens Rolandによるコメント から):

  1. 安全でない回線を介してそれを傍受することにより(パケットスニッフィング/セッションハイジャック)
  2. ユーザーのブラウザに直接アクセスする(マルウェアまたはボックスへの物理的なアクセスを介して)
  3. サーバーデータベースから読み込むことで(おそらくSQLインジェクションですが、何でも構いません)
  4. XSSハック(または同様のクライアントサイドの悪用)による
4
Jarl