2

私はこの質問が何度も聞かれるかもしれないことを知っていますが、それらのほとんどはあなたにip + username + passwordを保存し、このすべてをハッシュして比較することを提案します、代わりに私は私のウェブサイトのために別の解決策を思いつきました、私はこのようなことをしたいです:

セッションを使用してユーザー名、ユーザーID、タイムゾーンオフセットなどを保存しています。ユーザーがログインし、ユーザーが私を覚えていることを確認したとします。セッションを設定してから、ランダムな12〜13桁のIDを保持する変数uniqueidを生成します。これを設定する私は彼のブラウザでこの一意のIDとユーザー名を使用してCookieを作成し、それをデータベースに保存します。彼が戻ってきたら、そのIDとユーザー名のCookieが設定されているかどうかを確認します。ここで、username = cookie usernameを設定し、セッションを再度設定してホームページにスローします。それ以外の場合は、ログインページにリダイレクトします。

彼がログアウトした場合、私はすべてのCookieを削除し、彼が記憶を選択してログインした後、一意の値を更新します...

これを行う上で何か問題はありますか?またはそれを行うためのより良い方法?ハッシュ化された状態であっても、パスワードをCookieに保存したくないのですが、何をしているのでしょうか。

4

2 に答える 2

3

したがって、私があなたの説明を理解しているように、ユーザーがログインする(そして永続的にログインしたままにしたい)ときは、次のことを行います。

  • ランダムなトークンを作成します。
  • そのユーザーのユーザー データベース レコード (またはユーザー名とトークンを含む別のテーブル) にランダム トークンを保存します。
  • ユーザー名とトークンを含む Cookie をユーザーのブラウザーに設定します。

ユーザーが戻ってきてアクティブなセッションがなくても、上記の Cookie が設定されている場合は、データベースでユーザー名を検索します。データベースにそのユーザーの「remember me」トークンが含まれていて、そのトークンが Cookie 内のトークンと一致する場合、そのユーザーの新しいセッションを作成します。

ユーザーがログアウトすると、ブラウザから Cookie が削除され、データベースからトークンも削除されます。


もしそうなら、トークンが十分に長く、安全な乱数ジェネレーター ( Unix など)によって生成される限り、それは完全に安全な設計です。/dev/urandomトークンは「12 ~ 13 桁の長さ」で、40 ビット強に変換されます。それは少し低めです。少なくともその 2 倍をお勧めします。また、トークンを生成する方法についても言及していません。PHP のrandorを使用するだけmt_randでは安全ではありません。それらの出力は予測可能である可能性があるからです。

また、2 つの改善点を提案します。まず、トークンをデータベースに格納する前にハッシュします (SHA-1 などの任意の暗号化ハッシュ関数を使用できます。長いランダム トークンでは、PBKDF2 のような特別なパスワード ハッシュ関数は必要ありません)。データベースのコピーに成功した攻撃者がすべてのトークンを取得するわけではありません。次に、データベース内のトークンの有効期限を含めて、侵害された単一のトークンが永久に有効なままにならないようにします。

于 2012-09-09T08:33:00.513 に答える
1

ユーザー名やパスワードを Cookie に保存する必要はありません。保存する必要があるのは、データベース内のハッシュされたセッション識別子と比較できる一意の識別子 (ランダムに生成されたもの) だけです。

于 2012-09-09T08:10:33.143 に答える