0

我有一个带有注册/登录系统的 PHP 网站。出于安全原因,我希望用户一次只能从一台 PC 登录。如果在用户已经使用该 ID/密码登录时,相同的 ID/密码尝试从另一台 PC 登录,它应该会生成一条错误消息。

请告诉我这是怎么可能的,最好的方法是什么?

我只使用cookie...

<?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
}
4

2 回答 2

0

如果您还在用户表中添加列 session_id 并将会话存储在数据库中(更安全)您还可以更轻松地检查用户会话是否已过期以再次将登录列更新为 0,这对用户来说更防水不要使用注销功能...(升级 jycr753 解决方案)

于 2013-07-03T20:22:37.830 回答
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
}
于 2013-07-03T20:24:01.510 回答