后端登陆模块常见的校验策略

后端登录模块常见的校验策略(以安全为首要目标),从输入校验到风控防御,通常会分多层实现,以下是生产环境中广泛采用的实战校验策略汇总: 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); } 总结:现代后端登录模块已远不止“用户名+密码正确就放行”,而是一整套“参数→验证码→风控→账号状态→密码→二次验证→会话管理→日志”的立体防御体系。缺任何一层都可能被拖库、撞库、短信轰炸、羊毛党攻破。 ...

December 8, 2025 · 1 min · holdsky