7

この質問に対する簡単な答えを見つけることができないようです。ログインしたユーザーに強制的にログアウトさせる方法はありますか?私のログインシステムは基本的に、ユーザーの一意のID(mysqlデータベースに保存されている)を含むセッションに依存しています。だから本質的には...

if (isset($_SESSION['user_id'])) {
echo "You're logged in!";
} else {
echo "You need to login!";
}

しかし、このユーザーを禁止したいとしましょう。データベースでステータスを禁止に変更できますが、ユーザーがログアウトして再度ログインしようとするまで、これは何もしません...では、このユーザーを強制するにはどうすればよいですか。ログアウトするには?できれば、ページを表示するたびにステータスが「禁止」に切り替えられているかどうかを確認せずに、サーバーに不要なストレスがかかるように思われるためです。どんな助けでもありがたいです、ありがとう。

4

9 に答える 9

6

ページをロードするたびにチェックする必要があるか、設定された間隔でAjax呼び出しを調べて、DBからステータスをチェックする必要があります。

次に、を使用session_destroy();してセッションを終了できます。これにより、セッション全体が破棄されます。

それ以外の場合はunset($_SESSION['user_id']);、単一のセッション変数の設定を解除するために使用できます

于 2012-05-02T04:07:14.460 に答える
6

できれば、ページを表示するたびにステータスが「禁止」に切り替えられているかどうかを確認せずに、サーバーに不要なストレスがかかるように思われるためです。

セッションにユーザーのコピーを保存するのではなく、ページをロードするたびにデータベースからユーザーをロードすることは、完全に合理的な解決策です。また、ユーザーがデータベース内のコピーと同期しなくなるのを防ぎます(たとえば、ユーザーがログアウトして再度ログインしなくても、ユーザーのプロパティやアクセス許可を変更できます)。

于 2012-05-02T04:26:46.640 に答える
1

これをすべてのページに配置してみてください...

if (isset($_SESSION['user_id'])) {

    $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] ";
    $query = mysql_query($sql);

    if(!empty(mysql_num_rows($query))){ // found the banned user
       //redirect to logout or
       //session_destroy();
    }

} else {
echo "You need to login!";
}

ユーザーがまだログインしている場合...ユーザーのステータスが禁止されているかどうかを確認します...禁止されている場合..その後ログアウトします

于 2012-05-02T06:09:24.907 に答える
0

設定を解除できます。

unset($_SESSION['user_id'])
于 2012-05-02T04:06:59.090 に答える
0

この方法でカスタムセッションハンドラーを使用して、セッションデータをサーバーのどこにどのように保存するかを完全に制御できます。

したがって、特定のユーザーのセッションデータを、<user_id>.sessionたとえばと呼ばれるファイルに保存できます。次に、ユーザーをログアウトするには、そのファイルを削除するだけです。

于 2012-05-02T04:22:23.930 に答える
0

間隔を置いてAjaxを呼び出すと、サーバーに余分な負荷がかかります。アクションへのリアルタイムの応答が必要な場合(たとえば、システムバックエンドからアクションを禁止すると、ユーザーはすぐにサインアウトされます)、のようなものを調べる必要がありますServer Push

ユーザーがWebサイトを閲覧しているときはいつでも、サーバーからブラウザーへのトンネルを開いたままにして、サーバー側からもユーザーと通信できるようにするという考え方です。それらを禁止したい場合は、ログアウト要求とそれをページで処理するプロセスをプッシュします(つまり、セッションの設定を解除して強制的にログアウトします)。

于 2012-05-02T05:07:30.913 に答える
0

これは私にとってはうまくいきました。pHP5.4を使用しています。include'connect.php';

  session_start();
  if(session_destroy())
  {
     header("Location: login.php");
  }
于 2015-05-29T21:24:46.697 に答える
0

session_save_path()PHPがセッションファイルを保存するパスを見つけて、を使用してそれらを削除するために使用できunlink()ます。

サーバーに保存されているセッションファイルを削除すると、クライアント側のPHPSESSIDCookieは認証に無効になり、ユーザーは自動的にアプリケーションからロガーアウトされます。

問題のパスがグローバル/tmpディレクトリであることが判明した場合は、このアプローチを使用する際に十分に注意してください。一時データを格納するPHP以外のプロセスが必ず存在します。PHPにセッションデータ用に確保された独自のディレクトリがある場合でも、かなり安全です。

于 2016-12-13T04:54:30.853 に答える
-1

セキュリティに基づいて私の意見でこれを最善に行うには、いくつかの方法があります。注:これは本当にラフです....構文が間違っていることはわかっています。あなたがアイデアを得るだけです。

$con = mysql_connect("localhost","sampleuser","samplepass");
if (!$con)
{
$error = "Could not connect to server";
}
mysql_select_db("sampledb", $con);
$result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'");
$userdeets = mysql_fetch_array($result);
if($_SESSION['sessionvalue'] != $userdeets['sessionvalue'])
{
session_destroy();
Header('Location: logout.php');
}
else
{
$result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''");
 $sesval = mysql_fetch_array($result2);
$_SESSION['sessionvalue'] = $seshval
}

今、私はそれがコードそのものではないことを知っていますが、本質的に、安全でこの能力を持つためにあなたがしなければならないことは次のとおりです:

  • ページの読み込みをチェックするたびに、セッションの値がDBの値と一致します。
  • ページが読み込まれるたびに、ランダムに生成されたDB値に基づいて新しいセッション値が設定されます。セッションにもユーザー名を保存する必要があります。
  • セッションIDが一致しない場合は、セッションを破棄してリダイレクトします。
  • 一致する場合は、新しいセッションIDを作成します。

ユーザーを禁止する場合は、DB内のユーザーのセッション値を「BANNED」のような値に設定できます。この値では、どちらもログインできません。このようにして、簡単なWebフォームを使用してユーザーを制御したり、禁止されたユーザーのリストを非常に簡単に生成したりすることができます。

于 2012-05-02T07:46:28.853 に答える