我在理解如何使用php 5.5.0+ password_hash和password_verify来保护页面访问时遇到一些问题。
让我解释一下我的所作所为。 1)当我为我的webapp创建新用户时,我在用户表中存储用户名和散列密码。要在将密码存储到数据库之前对密码进行哈希处理,我使用
$hashedp = password_hash($password, PASSWORD_DEFAULT);
2)在页面登录时,我可以在表单中获取用户提交的密码,并以这种方式“比较”它与同一用户的数据库中存储的密码
$password = the password submitted by the user
$user_hashedp = the hashed password taken from the db
if (password_verify($password, $user_hashedp)) {
// login the user
} else {
// show error
}
3)我不明白的是,在用户登录后,我如何检查和保护对其他页面的访问权限。想象一下,只有用户正确记录才能显示另一页page1.php 。 我该如何构建此支票?
亲切的问候, 马特答案 0 :(得分:3)
就像在评论中已经说过的那样,您可以使用会话。下面是一个例子。
session_start();
if (password_verify($password, $user_hashedp)) {
// login the user
// create session for logged in user.
$_SESSION['authorized'] = true;
} else {
$_SESSION['authorized'] = false;
// show error
}
然后在authorizedusersonly.php中:
session_start();
if($_SESSION['authorized'] === true) {
//content for authorized users
} else {
//content for unauthorized users
}
答案 1 :(得分:0)
我不完全确定我参加聚会的时间有多晚,但Daan对做会话有正确的想法。
我会在成功登录后亲自设置用户名会话变量,然后在每个页面上,确保已设置。如果不是,将其重定向到某个页面,例如登录。
(?:\/(?!.*\/.+))([^\?\n]*)
在每个页面上,您可以包含一个包含会话验证码的文件,或者将其复制/粘贴到每个页面,就像这样:
if (password_verify($password, $user_hashedp)) {
$_SESSION["user"] = $user; // user being the login username; also verified.
} else {
echo "Invalid credentials!"; // Throw some type of error. That's up to you.
}
你可以用另一种方式做到这一点,但你最大的优势在于,如果你需要获取某些东西的用户名,而不是必须得到通过查询的用户名,这可能会影响效果,您只需引用会话变量并从那里处理它。
这就是我亲自去做的事情。