0

さまざまなユーザーが使用する Web アプリケーションがあります。同じユーザーが別のブラウザーまたはシステムにログインするのを避ける必要があります。

4

4 に答える 4

1

多くの回答 (つまり、「ログイン中フラグ」) にはかなり大きな問題があります!! ブラウザに問題が発生した場合はどうなりますか? (マシンがフォーマットされている、キャッシュ/Cookieがクリアされているなど)次に、サーバーがログインしていると見なすユーザーがいますが、ユーザーに関する限り、そうではなく...ログインできませんタイムアウトを追加し、各リクエストを監視する必要があります(タイムアウトをリセットするため)。

ユーザーがログインするたびに新しい資格情報を発行することをお勧めします。新しい資格情報を発行すると、以前の資格情報が無効になります。これを行う最も簡単な方法は、(ランダムな) トークンを作成し、そのトークンを Cookie とデータベース行に保存することです。データベースの値に対して Cookie をチェックし、それが最新であることを確認します。

これは他の回答の逆であることに注意してください(意図の逆かどうかはわかりません)-ユーザーは再度ログインできなくなりませんが、以前のログインは無効になります。

編集:

私が疑似コードで述べたこと:

//to authenticate user
if ($user = sql('select * from users where id = ' . intval($_COOKIE['user_id']) && $_COOKIE['token'] == $user['token']) {
    //user is authenticated. the token in their cookie is the same as the token in the db
} else {
    //user is not authenticated. 
}

//to log user in
if ($user = sql('select * from users where  = ' . intval($_REQUEST['user_id']) && $user['password'] == $_REQUEST['password']) {
    //user is authenticated and can be logged in now. the user id they passed and password match (though you'll probably be accepting email address and hasing the password...).
    $token = rand();
    setcookie('user_id', $user['user_id']);
    setcookie('token', $token);
    sql('update users set token = '$token' where user_id = ' . $user['user_id']);
    //now the token in the db has been updated, and only the user that just logged in has it. other instances of this users login don't have it, so can't authenticate
} else {
    //user is not authenticated and can't be logged in
}

このコードは疑似というよりも PHP に近いものですが、そのまま実行することを意図したものではありません。データベース ライブラリ、テーブル スキーマをカスタマイズし、セキュリティを確保する必要があります (パスワードに md5() を使用するなどして)。コンセプトを説明しようとしているだけです。

編集:上記のように、このアプローチのポイントは、ユーザーが再度ログインできるようにすることですが、以前のログインを無効にすることです。(これは、ユーザーの 2 回目のログインを許可しないのとは反対です。) いずれにせよ、ユーザーは 1 回だけログインします。問題は、最初のログインと最後のログインのどちらを許可するかです。しかし、今のあなたのコメントから、これはあなたが望んでいる (考えている) ものではないようです。

ユーザーが 2 回目にログインするのを阻止しようとすると、落とし穴がたくさんあります。最も単純なセットアップから始めて、ユーザーがログインし、データベースに「isLoggedIn」値を設定します。その後、その値がクリアされるまで (おそらく logout.php から)、ユーザーが再度ログインすることを許可しません。(これは他の人が提案したものです。先に進み、回答の 1 つに印を付けてください。) ログアウトできない場合はどうしますか? デスクトップからログインした後、オフィスからログインする必要がある場合は?

彼らのログインを禁止しますか? または、「ログインしてもよろしいですか」というメッセージを提示して、以前のログインを上書きできるようにすることもできます。その場合、以前のログインを無効にする方法が必要です。それでは、私のトークンの提案に戻ります。(この場合、データベース内のトークンの存在を使用して、以前のセッション (isLoggedIn に相当) にまだログインしていることを示し、ログアウトするときにそれをクリアします。)

2 回目のログインを防止しますか? その場合、ユーザーが積極的にログアウトすることに頼ることはできません。彼らがオフィスにいる場合はどうなりますか?または、電話からログインした後、電話を紛失しますか? または、Cookie をクリアします。タイムアウトに頼る必要があります。長すぎたり、ユーザーがオフィスに着いたときにログインできなかったりしないでください。また、短すぎたり、コーヒーを飲むたびにログインしなければならなくなったりしないでください。(セッション Cookie は役に立ちますが、ブラウザ ウィンドウを何日も開いたままにしておく人が多いため、セッション Cookie に頼ることはできません。)

この場合、ログイン中にページにアクセスするたびに、データベースの lastActivity を更新します。次に、lastActivity が >= now() - x 分であることを確認します。そうでない場合は、ログアウトします。ログインしようとするときも同じことをしなければなりません. lastActivity >= now() - x minutes の場合、ログインできないことを伝えます.

(PHPセッションに頼ることもできますが、これらを構成する経験が十分でないことを認めなければなりません。セッションの有効期限が切れたときにプラグインするハンドラを探しましたが、簡単に見えるものは見つかりませんでした.おそらく、次に PHP ページが呼び出される数日前にセッションが期限切れになる可能性があるためです。)

于 2012-12-26T07:08:07.420 に答える