我按照这个答案进行php登录系统(记住我) PHP login system: Remember Me (persistent cookie)
我能够使用成功设置cookie
$selector = base64_encode(random_bytes(9));
$authenticator = random_bytes(33);
$token = hash('sha256', $authenticator);
$expires = date('Y-m-d\TH:i:s', time() + 864000);
$stmt2 = $pdo->prepare("INSERT INTO auth_tokens (selector,token,userid,expires) VALUES (:selector, :token, :userid, :expires)");
$stmt2->bindParam(':selector', $selector);
$stmt2->bindParam(':token', $token);
$stmt2->bindParam(':userid', $userid);
$stmt2->bindParam(':expires', $expires);
$stmt2->execute();
setcookie(
'remember',
$selector.':'.base64_encode($authenticator),
time()+86400,
'/',
false
);
我似乎不了解这部分。 重新验证页面加载
if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
list($selector, $authenticator) = explode(':', $_COOKIE['remember']);
$row = $database->selectRow(
"SELECT * FROM auth_tokens WHERE selector = ?",
[
$selector
]
);
if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
$_SESSION['userid'] = $row['userid'];
// Then regenerate login token as above
}
}
1。。变量 $ selector 和 $ authenticator
由于代码中有一个查询,内容为从auth_tokens中进行选择,其中选择器= $ selector
2。。每次重新加载页面时,选择器都会更改,从而导致其随机性。因此,如果 $ selector = base64_encode(random_bytes(9)); ,当我运行此查询时,它与选择器列中的任何内容都不匹配 *“ SELECT * FROM auth_tokens WHERE选择器= $选择器” *
有人解释了重新验证页面加载和一些示例代码。
答案 0 :(得分:1)
$selector
和$authenticator
变量中应该包含什么
list($selector, $authenticator) = explode(':', $_COOKIE['remember']);
在先前访问中设置的cookie内容:
setcookie(…, $selector.':'.base64_encode($authenticator), …);
每次重新加载页面时,选择器都会更改,从而导致其随机性。
页面重新加载时不应更改。应该在成功登录后立即设置一次,并将其存储在两个位置(服务器数据库和浏览器cookie):
if ($login->success && $login->rememberMe) { // However you implement it
$selector = base64_encode(random_bytes(9));
$authenticator = random_bytes(33);
…
}