后端登录模块常见的校验策略(以安全为首要目标),从输入校验到风控防御,通常会分多层实现,以下是生产环境中广泛采用的实战校验策略汇总:
1. 基础参数校验(最基本的一道防线)
- 用户名/手机号/邮箱:非空、格式正则、长度限制、防注入(预编译语句或ORM自动处理)
- 密码:非空、长度(通常8-32位)、不能包含用户名等
- 验证码(图片/短信/邮箱):非空、长度固定、是否过期(通常60-300秒)
- 请求必传字段完整性(deviceId、timestamp、sign等)
2. 账号状态校验
- 账号是否存在
- 账号是否被禁用/冻结/注销
- 账号是否需要强制修改密码(首次登录、密码过期)
- 账号是否被加入黑名单
3. 密码相关安全校验
- 密码明文传输 → 必须强制HTTPS
- 密码加密传输(前端通常用RSA或SM2加密,后端私钥解密)
- 后端密码存储:bcrypt、scrypt、Argon2(加盐,绝不用MD5/SHA1明盐)
- 密码输错次数限制(单账号5-10次后锁定30分钟~永久,需要人工解封)
- 密码复杂度策略(可选:大小写+数字+特殊字符)
4. 验证码多重校验(防止暴力破解)
- 图片验证码:防自动化脚本
- 短信/邮箱验证码:限流(同一手机号/IP/设备1分钟1条,1小时5条,24小时10条)
- 验证码有效期 + 只能使用一次
- 验证码输错次数限制(3-5次后需要重新获取)
5. 登录风控与异常检测(核心防爆破、防薅羊毛)
- 同一账号短时间内多次登录失败次数超限 → 锁定
- 同一IP短时间内大量不同账号登录失败 → IP封禁
- 同一设备(deviceId/deviceFingerprint)短时大量账号尝试 → 设备封禁
- 异地登录检测(根据IP归属地,与历史登录地对比,差距>1000km触发二次验证)
- 短时间内大规模登录请求 → 触发全局限流或人工介入
- 用户代理(User-Agent)异常或频繁切换
- 无头浏览器、模拟器、爬虫特征检测
6. 会话安全策略
- 登录成功后颁发token(推荐无状态JWT,或服务端Session+Redis)
- JWT需设置合理过期时间(accessToken 15min ~ 2h,refreshToken 7 ~ 30天)
- 支持单点登录(同账号新登录踢掉旧设备)
- 支持多端互踢配置(Web端登录踢掉App等)
- 敏感操作二次验证(修改密码、支付等需重新输入密码或验证码)
7. 常见辅助安全措施
- 登录接口全局限流(令牌桶/漏桶算法,如QPS>500触发降级)
- 关键日志记录安全审计日志(登录IP、设备、时间、结果等)
- 登录成功后下发设备绑定关系(可用于后续风控)
- 支持可信设备管理(记住设备30天免二次验证)
- 密码传输前端可使用RSA/SM2非对称加密,或使用SRP协议(密码永不离客户端)
8. 特殊场景校验
- 第三方登录(微信、QQ、Apple):校验state防CSRF,校验code是否已被使用
- 无密码登录(短信登录):必须绑定手机号 + 短信验证码 + 设备风控
- 扫码登录:防钓鱼站点、心跳保活、状态机严格校验
推荐的实战分层校验伪代码结构(Java/SpringBoot示例)
@PostMapping("/login")
public Result login(@RequestBody LoginDTO dto) {
// 1. 基础参数校验
validateParams(dto);
// 2. 验证码校验
captchaService.check(dto.getCaptchaId(), dto.getCode());
// 3. 风控预检(IP、设备、全球限流)
riskControl.preCheck(dto);
// 4. 账号状态与密码校验
User user = userService.checkAccountAndPassword(dto);
// 5. 登录风控后置(异地、异常检测)
riskControl.afterLogin(user, request);
// 6. 生成token并记录登录日志
String token = jwtUtil.createToken(user);
loginLogService.asyncSave(user, request, true);
return Result.ok(token);
}
总结:现代后端登录模块已远不止“用户名+密码正确就放行”,而是一整套“参数→验证码→风控→账号状态→密码→二次验证→会话管理→日志”的立体防御体系。缺任何一层都可能被拖库、撞库、短信轰炸、羊毛党攻破。
如果你的项目体量较大,强烈建议引入专业的风控系统(如阿里云滑块验证码、网易易盾、同盾、ThreatBook等)或自研设备指纹+行为分析能力。
发表回复
要发表评论,您必须先登录。