簡體   English   中英

強制用戶注銷會話PHP

[英]Force user to logout session PHP

我似乎無法找到這個問題的直截了當的答案。 有沒有辦法可以強制登錄用戶注銷? 我的登錄系統基本上只依賴於包含用戶唯一ID(存儲在mysql數據庫中)的會話。 所以基本上只是......

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

但是,假設我想要禁止這個用戶,我可以在我的數據庫中將其狀態更改為禁止,但在用戶注銷並嘗試重新登錄之前,這將不會執行任何操作...所以,我該如何強制此用戶退出? 最好不要每次檢查他們查看頁面是否他們的狀態已被切換為“禁止”,因為這似乎是我服務器上的不必要的壓力。 感謝任何幫助,謝謝。

您需要在每次加載頁面時進行檢查,或者可能按設定的時間間隔查看Ajax調用以從數據庫檢查其狀態。

然后你可以使用session_destroy(); 結束他們的會議。 這會破壞整個會話。

否則你可以使用unset($_SESSION['user_id']); 取消設置單個會話變量

最好不要每次檢查他們查看頁面是否他們的狀態已被切換為“禁止”,因為這似乎是我服務器上的不必要的壓力。

在每次加載頁面時從數據庫加載用戶,而不是在會話中存儲用戶的副本,這是一個非常合理的解決方案。 它還可以防止用戶與數據庫中的副本不同步(例如,您可以更改用戶的屬性或權限,而無需他們注銷並重新登錄)。

試着把它放在每一頁......

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!";
}

如果用戶仍然登錄...檢查他/她的狀態是否被禁止......如果被禁止..然后注銷

你可以取消它。

unset($_SESSION['user_id'])

您可以使用自定義會話處理程序,這樣您就可以完全控制會話數據在服務器上的存儲位置和方式。

因此,您可以將特定用戶的會話數據存儲在名為<user_id>.session的文件中。 然后,要注銷用戶,只需刪除該文件。

間隔中的Ajax調用將在服務器上增加額外負載。 如果您想要對您的操作進行實時響應(例如,當您從系統后端禁止用戶時,用戶將被正確注銷),那么您應該查看Server Push

這個想法是在用戶瀏覽您的網站時保持從服務器到瀏覽器的隧道打開,以便您也可以從服務器端與它們進行通信。 如果您希望禁止它們,請按下注銷請求和頁面中的進程(即通過取消設置強制注銷)。

這適用於我使用pHP 5.4包括'connect.php';

  session_start();
  if(session_destroy())
  {
     header("Location: login.php");
  }

您可以使用session_save_path()來查找PHP保存會話文件的路徑,然后使用unlink()刪除它們。

刪除存儲在服務器中的會話文件后,客戶端PHPSESSID cookie將不再對身份驗證有效,並且用戶將自動退出應用程序。

使用這種方法時請小心,如果有問題的路徑是全局/ tmp目錄! 除了PHP之外,還有其他進程存儲臨時數據。 如果PHP為會話數據留出了自己的目錄,那么它應該是相當安全的。

基於安全性,我認為有幾種方法可以做到最好:注意:這真的很粗糙....我知道語法錯誤,它只是為了讓你有個主意。

$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表單控制用戶,您也可以非常容易地生成禁止用戶列表等等。我希望我有更多時間來解釋它,我希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM