如何使用php password_hash和password_verify构建密码保护

时间:2015-03-23 10:12:45

标签: php security password-protection

我在理解如何使用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 。 我该如何构建此支票?

亲切的问候, 马特

2 个答案:

答案 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.
}

你可以用另一种方式做到这一点,但你最大的优势在于,如果你需要获取某些东西的用户名,而不是必须得到通过查询的用户名,这可能会影响效果,您只需引用会话变量并从那里处理它。

这就是我亲自去做的事情。