编程技术记录

世界你好!

后端登录模块常见的校验策略(以安全为首要目标),从输入校验到风控防御,通常会分多层实现,以下是生产环境中广泛采用的实战校验策略汇总:

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等)或自研设备指纹+行为分析能力。

发表回复