php有效防止同一用戶多次登錄
PHP實現同一個帳號不允許多人同時重復登陸
數據庫表 user_login_info
字段:id,user_ip,user_id,last_access_time
user_id 做唯一性索引
1. 用戶登錄後
如果沒有當前用戶我的百分之一的數據,插入一條數據,user_ip(用戶機器的IP),user_id(用戶ID),last_access_time(當前登錄時間)
如果已經存在,則更新 user_ip,last_access_time 2個字段
2. 如何判斷?
另一個用戶,如果用相同的賬號
1)在同一臺機器上再次登錄的情況 【ip相同】,直接更新這個用戶的 last_access_time 時間為最新時間就可以了。
處理:直接更新 shop.inernetwork.net last_access_time 為最新時間
2)在另外一臺機器上登錄的情況【ip不同】,根據user_id取出數據,判斷ip和last_access_time(上次登錄時間),
如果當前時間 now()-last_access_time < 10 (分鐘) 【這裏是關鍵,設置一個時間】,說明有人在其他機器上已經登錄了,則不允許登錄。
now()-last_access_time > 10 (分鐘) ,則可以登錄,說明另一個人要不已經有10分鐘沒有活動了,要不就是沒登陸,這2種情況下都允許重新登錄。
3. 在程序的入口文件 index.php (ZF框架參考),每次用戶登錄後的操作,都更新 last_access_time 時間為最新時間 (這個也許效率上需要考慮一下,其實也應該沒什麽問題,數據庫完全可以承受,也可以在程序裏加上一個判斷,last_access_time 時間存在 session裏,如果這個時間跟當前時間 date() 比較,超過設定的10分鐘時間,則更新數據庫 last_access_time 字段。這樣可以減少更新數據庫的次數)
4. 異常退出的情況,比如用戶直接關閉瀏覽器,數據庫裏還有這條記錄,因為設置的過期時間是10分鐘,所以如果同一個用戶立刻再次登錄的情況下,肯定不行,會 提示已經有人登陸了。但10分鐘後就可以再次登錄,所以這個10分鐘時間看具體情況,可以設置成 1分鐘,或其他時間。
但這個時間不要設置成幾個小時,那用戶會瘋掉。
原理:就是設置一個過期時間的技巧和記錄IP。
一,會員表加一個字段(last_session),會員登陸時獲取當前SESSIONID更新此字段。
二,會員登陸時取得該(last_session)值去session_save_path看該文件有沒有,如有則直接刪除。
三,假如有兩個人以上同時使用的話,那麽前一個的會話文件就會被後面的一個所刪除,也就被逼下線了。
這樣也就達到了每次只能一個帳號使用的目的了,雖然用戶體驗略差,但也算是較高效的方法了。
【問題描述】:同一用戶在同一時間多次登錄如果不能檢測出來,是危險的。因為,你無法知道是否有其他用戶在登錄你的賬戶。如何禁止同一用戶多次登錄呢?
【解決方案】
(1) 每次登錄,身份認證成功後,重新產生一個session_id。
session_regenerate_id();
session_register ("username") ;
(2) 在用戶數據庫中開一個sessionid字段,重新產生session_id後,都更新該字段。
$sessionid = session_id();
$db = new PDO(‘sqlite:softToken.db‘);
$sql = "update userinfo set sessionid =‘$sessionid‘ where username=‘$username‘ and passwd=‘$passwd‘;";
$query = $db->prepare($sql);
$query->execute();
(3) 建立一個session保存用戶名
$_SESSION["username"] = $username;
(4) 利用url重寫,傳遞session_id
$url = "main.php?sid=".session_id();
unset($db);
echo "<font color=blue>登錄成功,正在跳轉!</font>" ;
header ("Location:$url");
(5) 在需要跳轉的頁面,起始處加入
main.php
<?php
header(‘Content-type:text/html; charset=utf-8‘);
$sessionid = $_GET[‘sid‘];
session_id($sessionid);
session_start ();
$username = $_SESSION["username"];
$db = new PDO(‘sqlite:softToken.db‘);
$sql = "select * from userinfo where username=‘$username‘ and sessionid=‘$sessionid‘;";
$query = $db->prepare($sql);
$query->execute();
$user = $query->fetch(PDO::FETCH_OBJ);
if ($user->username == ""){
session_destroy();
echo "<script language=‘javascript‘ type=‘text/javascript‘>" ;
echo "window.location.href = ‘index.html‘;" ;
echo "</script>" ;
exit () ;
}
?>
<html>
<body>
......
</body>
</html>
以上就是php有效防止同一賬號同一時間多次登錄的解決方案,希望對大家解決同一賬號同一時間多次登錄問題有所幫助。
php有效防止同一用戶多次登錄