1. 程式人生 > >php有效防止同一用戶多次登錄

php有效防止同一用戶多次登錄

undefine awk javascrip rip ... token where login tor

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有效防止同一用戶多次登錄