ユーザーが記憶機能を選択すると、ユーザー名と ID を Cookie に保存します。次に、ユーザーがサイトに戻ったときに、データベースに対してユーザー名と ID をチェックして、ユーザーが正当であることを確認します。次に、Cookie データをセッション変数に保存して、ユーザーをログインさせます。これは、ユーザーを記憶してログインする適切な方法ですか?
2 に答える
3
Cookie は、データを保存するための安全な方法ではありません。Cookie はユーザーによって変更される可能性があり、誰かがサイトに「ハッキング」する可能性があります。私が提案するのは、何かのハッシュである文字列をクッキーに保存することです。また、Cookie からハッシュされた文字列をデータベースに保存します。このようにして、ユーザーがサイトに戻ったときに、Cookie がいっぱいになっているかどうかを確認し、それをデータベース内のハッシュ値と照合して、そのハッシュ値の所有者を見つけます。すべてが有効な場合は、ログインします。
データベースのセットアップ
secretKey PK varchar
userid (could be unique) int
validUntil int or date/time
//If userID is unique you will have to remove this row from the
// database when a new key is made for the user, This would then mean
// that a user would only be allowed to be rememberd on one computer
疑似コード
//User logs in with remember me
//set cookie to something like md5(userid,username,timestamp)
//store the md5 in the database layout
//User Returns to site
//check to see if cookie is set
//if cookie set
//find md5 in database which is logged with user id
//if found and not yet expired log in
//else show login page
//if cookie not set show login page
有効期限フィールドでは、ログインから 2 週間と言うように設定します。有効期限が過ぎたら、そのキーを機能させず、ユーザーの Cookie の有効期限が切れていることを確認します。
ログインを確認するクエリ
SELECT * FROM rememberMe WHERE key="//ここに md5 を入力" AND validUntil > time()
于 2012-06-27T16:58:42.530 に答える
2
いいえ。
それは、どれだけ安全になりたいかによって異なります。セキュリティを強化するためにできること (一部またはすべて) を次に示します。
- Cookie に特定のもの (ユーザー名/ID など) を保存しないでください。ランダムに生成されたナンセンス (トークン) を使用します。
- あなたのDBでは、トークン<->ユーザーマッピングを持つことができます
- DB に対してトークンを確認し、一致する場合はユーザーをログインさせます
- トークンを破棄します (「消費済み」としてフラグを立てます。後で削除する可能性があります。何を決定しても、トークンは機能しなくなります)。
https
Cookie、ログインなどを送信するためだけに使用します。- ユーザーが古いトークン (つまり、DB にないトークン、または消費済みとしてフラグが付けられたトークン) を送信した場合、これはトークンが侵害された可能性があることを意味します。認証されたユーザーに対するすべてのリクエストで (おそらく ajax を使用しても)、ユーザーがログインに使用したトークン (セッションに保存できます) を古いトークン試行のリストと比較します。一致する場合は、認証されたユーザーがトークンを乗っ取った可能性が高いことを意味します。それらを追い出します。
于 2012-06-27T17:01:25.510 に答える