我有一个网站,用户可以选择该网站“记住我”(又名设置 cookie),并且根据该网站上的建议,我将数据库中的密码加密切换为 php 的 password_hash()
功能。现在,我不能只是将任何旧的哈希值相互比较,因此我使用 php 的 password_verify()
。密码验证需要明文和密码哈希。
如何将用户密码存储在浏览器 cookie 中而不是明文?
最佳答案
将密码存储在 cookie 本身中是一个非常糟糕的主意,不要这样做。
在很高的水平上,我会:
- 生成一个 token (类似于
md5
),其中包含该用户的几个唯一(但一致)属性 - 将用户 ID 和此 token 存储在 Cookie 中(用一些已知的分隔符分隔)
- 当用户访问您的网站时,您可以将 ID 和 token 分开
- 使用 ID 从数据库中获取用户记录,从数据库记录中创建新 token ,并与 Cookie token 进行比较
让我们简单地回顾一下这一点。假设 $hash
是存储在数据库中的密码哈希,并且您还有该用户的 $userId
和 $username
变量。
我会生成一个看起来像这样的cookie:
$token = md5($userId . $username . $hash);
$cookie = $userID . "|" . $token; // 1|XXXXXXXX
现在,当用户访问您的网站并且您检索此 Cookie 时:
$parts = explode("|",$cookie);
$userId = $parts[0];
$token = $parts[1];
现在您知道用户声称是谁,但您需要验证。
从数据库中取出用户记录,然后重新生成token并进行比较。
// Assuming you just ran a SELECT query, and fetched the result into `$row`
$dbToken = md5($row['userId'] . $row['username'] . $row['hash']);
if($token == $dbToken) {
// The user is who he claims to be! Log them in
} else {
// The cookie token didn't match our re-generated token, don't trust this cookie
}
有道理吗?您可能需要根据您的情况对此进行一些修改。希望这至少可以帮助您朝着好的方向前进。
关于php - Cookie 加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176514/