<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>登陆 on 编程技术记录</title>
    <link>https://blog.z6z8.cn/tags/%E7%99%BB%E9%99%86/</link>
    <description>Recent content in 登陆 on 编程技术记录</description>
    <generator>Hugo</generator>
    <language>zh-Hans</language>
    <lastBuildDate>Mon, 08 Dec 2025 00:19:59 +0000</lastBuildDate>
    <atom:link href="https://blog.z6z8.cn/tags/%E7%99%BB%E9%99%86/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>后端登陆模块常见的校验策略</title>
      <link>https://blog.z6z8.cn/2025/12/08/%E5%90%8E%E7%AB%AF%E7%99%BB%E9%99%86%E6%A8%A1%E5%9D%97%E5%B8%B8%E8%A7%81%E7%9A%84%E6%A0%A1%E9%AA%8C%E7%AD%96%E7%95%A5/</link>
      <pubDate>Mon, 08 Dec 2025 00:19:59 +0000</pubDate>
       <guid isPermaLink="false">https://blog.z6z8.cn/?p=1520</guid> 
      <description>&lt;p&gt;后端登录模块常见的校验策略（以安全为首要目标），从输入校验到风控防御，通常会分多层实现，以下是生产环境中广泛采用的实战校验策略汇总：&lt;/p&gt;
&lt;h3 id=&#34;1-基础参数校验最基本的一道防线&#34;&gt;1. 基础参数校验（最基本的一道防线）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户名/手机号/邮箱：非空、格式正则、长度限制、防注入（预编译语句或ORM自动处理）&lt;/li&gt;
&lt;li&gt;密码：非空、长度（通常8-32位）、不能包含用户名等&lt;/li&gt;
&lt;li&gt;验证码（图片/短信/邮箱）：非空、长度固定、是否过期（通常60-300秒）&lt;/li&gt;
&lt;li&gt;请求必传字段完整性（deviceId、timestamp、sign等）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-账号状态校验&#34;&gt;2. 账号状态校验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;账号是否存在&lt;/li&gt;
&lt;li&gt;账号是否被禁用/冻结/注销&lt;/li&gt;
&lt;li&gt;账号是否需要强制修改密码（首次登录、密码过期）&lt;/li&gt;
&lt;li&gt;账号是否被加入黑名单&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-密码相关安全校验&#34;&gt;3. 密码相关安全校验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;密码明文传输 → 必须强制HTTPS&lt;/li&gt;
&lt;li&gt;密码加密传输（前端通常用RSA或SM2加密，后端私钥解密）&lt;/li&gt;
&lt;li&gt;后端密码存储：bcrypt、scrypt、Argon2（加盐，绝不用MD5/SHA1明盐）&lt;/li&gt;
&lt;li&gt;密码输错次数限制（单账号5-10次后锁定30分钟~永久，需要人工解封）&lt;/li&gt;
&lt;li&gt;密码复杂度策略（可选：大小写+数字+特殊字符）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-验证码多重校验防止暴力破解&#34;&gt;4. 验证码多重校验（防止暴力破解）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;图片验证码：防自动化脚本&lt;/li&gt;
&lt;li&gt;短信/邮箱验证码：限流（同一手机号/IP/设备1分钟1条，1小时5条，24小时10条）&lt;/li&gt;
&lt;li&gt;验证码有效期 + 只能使用一次&lt;/li&gt;
&lt;li&gt;验证码输错次数限制（3-5次后需要重新获取）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-登录风控与异常检测核心防爆破防薅羊毛&#34;&gt;5. 登录风控与异常检测（核心防爆破、防薅羊毛）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同一账号短时间内多次登录失败次数超限 → 锁定&lt;/li&gt;
&lt;li&gt;同一IP短时间内大量不同账号登录失败 → IP封禁&lt;/li&gt;
&lt;li&gt;同一设备（deviceId/deviceFingerprint）短时大量账号尝试 → 设备封禁&lt;/li&gt;
&lt;li&gt;异地登录检测（根据IP归属地，与历史登录地对比，差距&amp;gt;1000km触发二次验证）&lt;/li&gt;
&lt;li&gt;短时间内大规模登录请求 → 触发全局限流或人工介入&lt;/li&gt;
&lt;li&gt;用户代理（User-Agent）异常或频繁切换&lt;/li&gt;
&lt;li&gt;无头浏览器、模拟器、爬虫特征检测&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;6-会话安全策略&#34;&gt;6. 会话安全策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;登录成功后颁发token（推荐无状态JWT，或服务端Session+Redis）&lt;/li&gt;
&lt;li&gt;JWT需设置合理过期时间（accessToken 15min ~ 2h，refreshToken 7 ~ 30天）&lt;/li&gt;
&lt;li&gt;支持单点登录（同账号新登录踢掉旧设备）&lt;/li&gt;
&lt;li&gt;支持多端互踢配置（Web端登录踢掉App等）&lt;/li&gt;
&lt;li&gt;敏感操作二次验证（修改密码、支付等需重新输入密码或验证码）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-常见辅助安全措施&#34;&gt;7. 常见辅助安全措施&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;登录接口全局限流（令牌桶/漏桶算法，如QPS&amp;gt;500触发降级）&lt;/li&gt;
&lt;li&gt;关键日志记录安全审计日志（登录IP、设备、时间、结果等）&lt;/li&gt;
&lt;li&gt;登录成功后下发设备绑定关系（可用于后续风控）&lt;/li&gt;
&lt;li&gt;支持可信设备管理（记住设备30天免二次验证）&lt;/li&gt;
&lt;li&gt;密码传输前端可使用RSA/SM2非对称加密，或使用SRP协议（密码永不离客户端）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;8-特殊场景校验&#34;&gt;8. 特殊场景校验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第三方登录（微信、QQ、Apple）：校验state防CSRF，校验code是否已被使用&lt;/li&gt;
&lt;li&gt;无密码登录（短信登录）：必须绑定手机号 + 短信验证码 + 设备风控&lt;/li&gt;
&lt;li&gt;扫码登录：防钓鱼站点、心跳保活、状态机严格校验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;推荐的实战分层校验伪代码结构javaspringboot示例&#34;&gt;推荐的实战分层校验伪代码结构（Java/SpringBoot示例）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@PostMapping&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/login&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Result &lt;span style=&#34;color:#a6e22e&#34;&gt;login&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;@RequestBody&lt;/span&gt; LoginDTO dto) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 1. 基础参数校验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    validateParams(dto);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 2. 验证码校验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    captchaService.&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(dto.&lt;span style=&#34;color:#a6e22e&#34;&gt;getCaptchaId&lt;/span&gt;(), dto.&lt;span style=&#34;color:#a6e22e&#34;&gt;getCode&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 3. 风控预检（IP、设备、全球限流）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    riskControl.&lt;span style=&#34;color:#a6e22e&#34;&gt;preCheck&lt;/span&gt;(dto);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 4. 账号状态与密码校验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    User user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; userService.&lt;span style=&#34;color:#a6e22e&#34;&gt;checkAccountAndPassword&lt;/span&gt;(dto);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 5. 登录风控后置（异地、异常检测）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    riskControl.&lt;span style=&#34;color:#a6e22e&#34;&gt;afterLogin&lt;/span&gt;(user, request);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 6. 生成token并记录登录日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    String token &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; jwtUtil.&lt;span style=&#34;color:#a6e22e&#34;&gt;createToken&lt;/span&gt;(user);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    loginLogService.&lt;span style=&#34;color:#a6e22e&#34;&gt;asyncSave&lt;/span&gt;(user, request, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Result.&lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt;(token);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;总结：现代后端登录模块已远不止“用户名+密码正确就放行”，而是一整套“参数→验证码→风控→账号状态→密码→二次验证→会话管理→日志”的立体防御体系。缺任何一层都可能被拖库、撞库、短信轰炸、羊毛党攻破。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
