话不多说,依旧你们老叔,今天跟大家讲一下登录到底该怎么写,才不容易被人爆破、撞库、绕过鉴权。
很多兄弟项目里登录功能看着能用,结果一上公网就被脚本猛刷,轻则账号异常,重则后台失守。
这篇我不讲空话,直接按真实上线标准来拆:密码怎么存、Token 怎么发、风控怎么做、权限怎么兜底,给你一套能落地的思路。
很多项目的登录功能都能“跑起来”,但离“能上线”差得很远。真正可上线的登录系统,至少要同时解决三件事:
– 认证可靠:你是谁
– 鉴权清晰:你能做什么
– 风控可控:你是不是在被攻击
这篇帖子用工程视角讲一套中小项目可直接落地的方案,技术栈不限(PHP、Node、Java 都能套)。
一、先统一边界:认证和鉴权不是一回事
最常见误区是把“
认证”和“鉴权”混在一起。
– 认证(
Authentication):确认用户身份,例如账号密码、短信验证码、2FA– 鉴权(
Authorization):确认用户权限,例如管理员能删帖,普通用户不能
落地建议:
– 登录接口只负责认证,不做业务权限判断
– 每个业务接口都做鉴权,不依赖前端按钮显隐
– 权限模型用
RBAC(角色-权限)即可覆盖大多数场景二、密码存储:永远不要“可逆”
线上事故里最常见的一个雷:把密码加密后存库,甚至明文存库。正确做法是单向哈希。
2.1 推荐策略
– 使用 `
password_hash()`(Bcrypt 或 Argon2)– 使用 `
password_verify()` 比较密码– 禁止自定义“md5+盐”这类方案
示意代码(PHP):
<?php
$hash = password_hash($plainPassword, PASSWORD_ARGON2ID);
if (!password_verify($inputPassword, $hash)) {
throw new RuntimeException('用户名或密码错误');
}
2.2 额外建议
– 强制密码复杂度(长度+字符类型)
– 命中弱口令库时拒绝设置
– 支持定期轮换高价值账号密码
三、会话设计:JWT 不是银弹
很多团队默认上
JWT,但没处理好注销、续期、风控,最后反而更复杂。3.1 中小项目推荐
–
Access Token 短期(15~30 分钟)–
Refresh Token 长期(7~30 天)–
Refresh Token 必须可撤销(服务端存储或黑名单)3.2 Cookie 安全属性必须开
– `
HttpOnly`:防止 JS 读取– `
Secure`:仅 HTTPS 传输– `
SameSite=Lax/Strict`:降低 CSRF 风险如果你走前后端分离,也建议优先
Cookie + CSRF Token 组合,而不是把 token 暴露在 `localStorage`。四、登录接口风控:先扛住撞库和爆破
一个没风控的登录接口,等于公开邀请撞库机器人
4.1 必做四件事
– 限流:按 IP + 账号双维度限制频率
– 失败计数:连续失败触发验证码/二次验证
– 延迟响应:失败后随机增加 100~500ms
– 审计日志:记录登录成功/失败、IP、UA、地理信息
4.2 错误提示不要泄露信息
不要返回“用户不存在”或“密码错误”,统一为:
– 用户名或密码错误
否则攻击者可用返回文案批量枚举账号。
五、鉴权模型:RBAC 足够你用很久
推荐最小模型:
– `
users` 用户表– `
roles` 角色表(admin、editor、user)– `
permissions` 权限表(post:delete、user:ban)– `
user_roles`、`role_permissions` 关系表
接口鉴权统一中间件处理:
– 先认证身份
– 再校验权限码
– 拒绝时返回 403
这样做的价值是:权限变更不需要改业务代码,只改配置和关系数据。
六、找回密码:最容易被忽视的攻击面
很多系统登录做得不错,结果被“找回密码”绕过。
安全要求:
– 重置链接一次性使用,10~15 分钟过期
– Token 必须高强度随机,不可预测
– 重置成功后立即让所有旧会话失效
– 邮件和短信模板不泄露内部信息
七、上线前自检清单
– 密码哈希算法已使用
Bcrypt/Argon2– 登录接口已限流并有失败计数策略
– 所有会话
Cookie 已启用 HttpOnly/Secure/SameSite– 已支持主动注销和 token 撤销
– 接口鉴权由中间件统一处理
– 找回密码 token 一次性且有过期时间
– 登录与鉴权审计日志可查询可告警
– 核心账号支持 2FA
八、常见反模式(踩一个就可能出事故)
– 用手机号+生日当默认密码
– 把 token 存
localStorage 且无 XSS 防护– 管理员后台无二次验证
– 鉴权只在前端做,后端不校验
– “测试环境”长期暴露公网且复用生产账号





没有回复内容