我刚刚做了这个流行的小教程(http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL)来创建一个用户登录系统。最后一点向您展示了如何检查用户是否已登录。我只是想知道如何判断哪个用户已登录,以便我可以提取他们自己的详细信息?任何帮助都会很棒!
非常感谢,
乔
我刚刚做了这个流行的小教程(http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL)来创建一个用户登录系统。最后一点向您展示了如何检查用户是否已登录。我只是想知道如何判断哪个用户已登录,以便我可以提取他们自己的详细信息?任何帮助都会很棒!
非常感谢,
乔
教程中的这段代码解释了:
cookie 只是保存会话 id,以便 PHP 知道要加载哪个 $_SESSION 变量。
当用户登录时,您将此数据保存在 SESSION var 中:
$user_id = preg_replace("/[^0-9]+/", "", $user_id); // XSS protection as we might print this value
$_SESSION['user_id'] = $user_id;
$username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username); // XSS protection as we might print this value
$_SESSION['username'] = $username;
$_SESSION['login_string'] = hash('sha512', $password.$user_browser)
您将用户 ID 和用户名保存在会话中。还有一个由用户哈希密码和当前使用的浏览器组成的登录字符串。
您可以在页面开始时加载所有数据,只需访问$_SESSION
.
因此,从中获取用户名$_SESSION['user_id']
并使用它从数据库中获取此用户数据。
这是您获取用户的方式,但更重要的是,您必须检查会话是否确实属于该用户。在本教程中,意味着您必须尝试从刚从数据库中获得的用户生成相同的 login_string,并将其与会话中保存的 login_string 匹配。
这样,您可以确保此会话没有被盗。
例如:
$userid_from_session = $_SESSION['user_id'];
$stmt = $mysqli->prepare("SELECT id, username, password FROM members WHERE id = ? LIMIT 1");
$stmt->bind_param('s', $userid_from_session ); // Bind "$userid_from_session " to parameter.
$stmt->execute(); // Execute the prepared query.
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password); // get variables from result.
$stmt->fetch();
//check if username from cookie exists
if($stmt->num_rows == 1) {
//yep, now lets check the rest
//user must use same browser
$user_browser = $_SERVER['HTTP_USER_AGENT']
// compare generated login_string with saved one from session
if($_SESSION['login_string'] == hash('sha512', $db_password.$user_browser){
// Awesome, this is the correct user ($user_id)
} else {
// The login string is incorrect, this cookie must be hijacked or something.
}
} else {
// User doesn't exists, this session is edited or crap
}