3

ユーザーがブラウザー A を使用して Web サイトにログインし、「remember me」をチェックしてから、「remember me」を使用してブラウザー B にログインすると、ブラウザー間でユーザーを記憶する Cookie を使用して「remember me」システムを実装しようとしています。 、使用するブラウザに関係なく、引き続き自動的にログインされます。(ブラウザ B で「remember me」をチェックしても、ブラウザ A での永続的なログインは中断されません)。

これを行うために、複数のキーをユーザー ID と一緒に保存できるようにデータベースをセットアップしました。ユーザーが私の Web サイトにログオンすると、Cookie の値がチェックされます。その値がデータベースで見つかった場合、ユーザーに新しい Cookie が割り当てられ、データベース内のその Cookie キー エントリが更新されて一致します。他のブラウザのログインの永続性が影響を受けないように、他のキーはそのままにしておきます。ユーザーが手動でログアウトすると、Cookie がチェックされ、データベース内の対応するエントリが削除されてから、Cookie が削除されます。

ユーザーが自分の Cookie を手動で削除すると、問題が発生します。ユーザーがこれを行った場合、データベース内の対応するエントリを削除する方法がありません。それは私のデータベースの永続的なエントリになるだけです。これは、クロスブラウザーの「remember me」をサポートしようとしていないときは問題ではありませんでしたが、複数の Cookie キーを保存できるようにしたことで問題になりました。

これを修正/回避する方法はありますか?

永続的なログインに関する情報は山ほどありますが、ブラウザ間の永続的なログインはカバーされていないようです。(また、私のアプローチとセキュリティの問題について自由に批判してください。ユーザーごとに1つの「remember me」のみを許可していた方が安全に見えましたが、ブラウザー間での永続的なログインはユーザーが望む機能のようです).

MySQLとPHPを使用しています。

4

4 に答える 4

2

「私を覚えている(十分に長い)」ソリューションを使用することをお勧めします。セッションに有効期限を設定しますが、長いものにします。ユーザーがログインする頻度に応じて、これは 8 時間から 1 週間、さらに 1 年以上かかる可能性があります。有効な Cookie を使用して訪問するたびに、舞台裏で有効期限が更新され、永続的に表示されます。Cookie を削除すると、最終的にはセッションが削除されます。

(実際にセッションを使用していない場合は、そのように聞こえますが、これに関するメンテナンス コーディングを追加する必要があります。車輪を再発明するのではなく、セッションについて学ぶのがおそらく最善です。)

于 2012-05-02T06:46:04.390 に答える
2

あなたの質問に明確に答えるには:

野生の不正なremember_meトークンを知る方法はありません。唯一の本当の解決策は、remember_meトークンを数週間だけ存続させ、cronジョブまたはデーモンでそれらを殺すことです。

これにより、リクエストのユースケースと思われるDBの過密が修正されます。

現実の問題に直面していることに注意してください。ユーザーがいつ Cookie を削除したかを推測する方法がなく、ブラウザやその他の方法からバックプロセスが起動されないため、そうでない場合は定期的にそれらを強制終了するしかありません。 used、一度使用すると有効期限を更新します。

あなたのシステムを説明する方法はより安全です (正しく行われた場合) 長いライブ php セッションなので、現在のアプローチを維持し、シリーズ + トークンで保護し、数週間使用されていない long_live トークンを削除することをお勧めします。

お役に立てば幸いです。

于 2012-05-02T21:26:11.893 に答える
2

Cookie に有効期限を設定するという @llion の提案に同意します。その場合、期限切れの Cookie を dB から消去するプロセスをスケジュールできます。ただし、Cookieを見るたびに有効期限を延ばすことで、Cookie が無期限に永続的であるかのようにユーザーに見せることができます。

この質問に関心のある他の読者のために、dB に Cookie のハッシュのみを保存していることを本当に願っています。

于 2012-05-02T06:53:13.947 に答える
0

うーん、彼が別のマシンにいて、同じログインのブラウザを使用している場合はどうなりますか?それは必ず起こるでしょう。私たちの家ではいつもこれをしています。私は階下に3つの箱を持っており、母は上階に2台の機械を持っています。

microtimeとnavigatior.userAgentのUA文字列を使用して、セッションが一意であることを保証できるかもしれません。

しかし、あなたはコンピュータ名を取得することはできません。ただし、JSAPIを介してIPアドレスを取得できる可能性があります。http://www.w3.org/TR/2010/WD-system-info-api-20100202/#network ですが、これを使用すると、ブラウザで何らかの警告ダイアログが表示される場合があります。いいえ。動作しません。

javaはIPを取得できます。

于 2012-05-02T11:00:13.900 に答える