我有一个带有注册/登录系统的PHP网站。出于安全考虑,我希望用户一次只能从一台PC登录。如果相同的ID /密码尝试在用户已使用该ID /密码登录时从另一台PC登录,则应生成错误消息。
请告诉我这是怎么可能的,最好的方法是什么?
我只使用cookies ...
<?php function sec_session_start() {
$session_name = 'sec_session_id'; // Set a custom session name
$secure = false; // Set to true if using https.
$httponly = true; // This stops javascript being able to access the session id.
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies.
$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
session_name($session_name); // Sets the session name to the one set above.
session_start(); // Start the php session
session_regenerate_id(true); // regenerated the session, delete the old one.
}
以下是代码:
if(login($name, $password, $mysqli) == true) {
// Login success
if($name == 'admin'){
if($signin == 'zero'){
$stmt = $mysqli->prepare("UPDATE users SET signin = 'one' WHERE name = 'admin'");
$stmt->execute();
?>
<span class="TextFont"><br /><br />Welcome Admin! <a href="admin.php">Click here to access your Admin Panel</a>! <br /><br /> <a href="logout.php">Logout</a></span>
<?php }
else{
echo"You are already logged in from some other system! $signin";
}}
else{
// some PHP code
}
else{
// some PHP code
}
答案 0 :(得分:0)
如果您还在用户表中添加了一个列session_id,并且您将会话存储在数据库中(甚至更安全)如果用户会话过期,您还可以更轻松地检查以再次将登录列更新为0,这样更防水针对不使用注销功能的用户...(已升级的jycr753解决方案)
答案 1 :(得分:0)
过去对我有用的是这个。
在用户表中添加一列以存储会话ID。
当用户进行身份验证时,使用会话进行更新用户记录以进行登录。
当您检查请求是否已通过身份验证时,请在数据库中搜索用户的会话ID。
请注意,每个页面上都会出现session_regenerate_id,您必须使用每个请求更新用户记录,另一种方法是在会话中存储唯一值,并在用户记录上更新,并通过匹配值确认经过身份验证的请求那个。
在伪代码中
session_start();
session_regenerate_id();
if ($_SESSION["session_key"]);
$user = UserStore::getUserBySessionKey($_SESSION["session_key"]);
if ($user){
// the request is authenticated
} else {
// redirect to the login page
}
登录
session_start();
session_regenerate_id();
$user = UserStore::authenticateUser($username, $password);
if ($user){
$sessionKey = uniqid().$user->username;
$user->setSessionkey($sessionKey);
$user->save();
$_SESSION["session_key"] = $sessionKey;
} else {
// show the login form with an error
}