0

我刚刚做了这个流行的小教程(http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL)来创建一个用户登录系统。最后一点向您展示了如何检查用户是否已登录。我只是想知道如何判断哪个用户已登录,以便我可以提取他们自己的详细信息?任何帮助都会很棒!

非常感谢,

4

1 回答 1

1

教程中的这段代码解释了:

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
}
于 2013-09-05T18:22:05.080 回答