php 8 中“记住登录”应生成高熵随机 token 并存哈希值到数据库,通过 setcookie 安全下发,验证时用 hash_equals 比对哈希,支持自动登录、token 刷新及登出时双向清理。

PHP 8 中用 Cookie 实现“记住登录”功能,核心是配合服务端验证、安全 Token 和合理 Cookie 属性设置,而不是直接存用户名密码。直接存明文或简单加密的密码到 Cookie 是严重安全隐患,现代做法一律避免。
生成并存储安全的 Remember Token
用户勾选“记住我”并登录成功后,不要存账号密码,而是生成一个高熵、一次性、可撤销的随机 Token:
- 用 random_bytes() 生成 32 字节随机串,再 base64_encode 或 bin2hex 处理成字符串
- 将该 Token 的哈希值(如 hash_hmac('sha256', $token, $secret_key))存入数据库 user 表的
remember_token_hash字段 - 原始 Token 只用于下发给浏览器,绝不落库
通过 setcookie() 安全下发 Token
使用 PHP 8 的 setcookie() 第四参数数组形式,显式设置关键安全属性:
-
expires:设为未来 7–30 天(如
time() + 86400 * 14),避免永久有效 -
path:设为
'/'确保全站可读 -
domain:明确指定主域名(如
'example.com'),防止子域越权 -
secure:设为
true,确保仅 HTTPS 传输 -
httponly:设为
true,阻止 JavaScript 访问,防 XSS 窃取 -
samesite:推荐
'Lax'或'Strict',缓解 CSRF 攻击
示例代码:
setcookie('remember_token', $raw_token, [
'expires' => time() + 86400 * 14,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);后续请求中自动恢复登录态
每次用户访问受保护页面前(如在中间件或公共初始化文件中),检查 Cookie 并验证 Token:
- 先确认
$_COOKIE['remember_token']存在且非空 - 计算该 Token 的哈希值,与数据库中对应用户的
remember_token_hash比对(用 hash_equals() 防时序攻击) - 比对成功后,启动 Session(
session_start()),写入$_SESSION['user_id'],完成“自动登录” - 同时可刷新 Token:生成新 Token,更新数据库哈希值,并重设 Cookie(延长有效期)
退出与失效管理
用户主动登出或管理员强制下线时,必须同步清理客户端和服务端状态:
- 调用
setcookie('remember_token', '', ['expires' => 1, 'path' => '/', 'domain' => 'example.com', 'secure' => true, 'httponly' => true])清除浏览器 Cookie - 将数据库中该用户的
remember_token_hash设为空或 NULL - 建议增加定期任务,清理超过 30 天未使用的 remember_token 记录
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











