破茧成蝶:Java后端从0到资深工程师的进阶之路(九)

张开发
2026/4/10 1:34:33 15 分钟阅读

分享文章

破茧成蝶:Java后端从0到资深工程师的进阶之路(九)
破茧成蝶Java后端从0到资深工程师的进阶之路九安全篇——构筑坚不可摧的后端防线安全是系统的生命线。一个微小的漏洞可能导致用户数据泄露、服务器被入侵、业务遭受重创。很多开发者关注功能实现却忽视了安全防护直到被攻击才追悔莫及。本篇将带你全面了解后端安全的常见威胁与防御手段从认证授权、数据加密到漏洞防护为你的系统穿上“铠甲”。写在前面我曾经接手过一个项目用户的密码以明文存储在数据库中另一个项目接口没有做任何权限校验任意用户都能调用管理员接口删除数据。这些看似低级的错误却真实存在于不少生产系统中。安全不是“可选项”而是每个后端开发者的必备素养。本篇文章核心内容认证与授权从 Session 到 JWTOAuth2 与 RBAC 模型。数据安全密码加密、传输加密、敏感数据脱敏。常见漏洞防护SQL 注入、XSS、CSRF、SSRF、文件上传漏洞。安全审计与日志操作日志、异常监控、入侵检测。掌握这些你将能构建一个经得起考验的安全系统。一、认证与授权把好系统第一关1.1 认证方案演进从 Session 到 JWT1.1.1 基于 Session 的传统认证流程用户登录 → 服务端创建 Session 并存入内存/Redis → 返回 SessionIdCookie→ 后续请求携带 Cookie 验证。优点服务端可主动失效安全性高。缺点分布式环境下需要共享 Session 存储如 Spring Session Redis移动端不友好。1.1.2 基于 Token 的认证JWTJWTJSON Web Token是一种自包含的 Token由三部分组成Header.Payload.Signature。优点无状态服务端不需要存储 Token适合分布式系统。移动端友好可放在 Header 或 URL 参数中。缺点Token 一旦签发服务端无法主动使其失效除非引入黑名单。Payload 信息是 Base64 编码不要存放敏感数据。Spring Boot 集成 JWT 示例// 生成 JWTpublicStringgenerateToken(StringuserId){returnJwts.builder().setSubject(userId).setIssuedAt(newDate()).setExpiration(newDate(System.currentTimeMillis()3600000))// 1小时.signWith(SignatureAlgorithm.HS256,secretKey).compact();}// 解析 JWTpublicClaimsparseToken(Stringtoken){returnJwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();}Token 续期策略滑动过期每次请求返回新的 Token。双 Token 机制Access Token短期 Refresh Token长期Refresh Token 存储在 Redis 中可主动撤销。1.2 OAuth2 与单点登录SSO场景允许用户使用微信、GitHub 登录或企业内部统一认证。核心角色资源所有者、客户端、授权服务器、资源服务器。简化流程授权码模式用户点击“微信登录”跳转到微信授权页。用户同意授权后微信回调带上授权码。后端用授权码换取 Access Token。用 Access Token 获取用户信息完成登录。Spring Security OAuth2已迁移至 Spring Authorization Server推荐使用。1.3 RBAC 权限模型RBACRole-Based Access Control通过“用户 → 角色 → 权限”的映射实现权限管理。数据库设计CREATETABLEuser(idbigintPRIMARYKEY,usernamevarchar(50));CREATETABLErole(idbigintPRIMARYKEY,namevarchar(50));CREATETABLEpermission(idbigintPRIMARYKEY,codevarchar(100),resourcevarchar(200));CREATETABLEuser_role(user_idbigint,role_idbigint);CREATETABLErole_permission(role_idbigint,permission_idbigint);Spring Security 实现自定义UserDetailsService加载用户角色和权限。使用PreAuthorize(hasAuthority(order:create))注解方法级权限控制。二、数据安全加密与脱敏2.1 密码加密永远不要存明文原则使用单向散列函数如 bcrypt、PBKDF2、argon2不可逆。必须加盐salt且每个用户盐值不同。Spring Security 推荐 BCryptPasswordEncoderBeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();// 自动生成盐}// 存储encoder.encode(rawPassword)// 验证encoder.matches(rawPassword, encodedPassword)2.2 传输加密HTTPS 与 TLS生产环境必须启用 HTTPS防止中间人攻击。使用 Let’s Encrypt 免费证书或购买商业证书。配置 HSTSHTTP Strict Transport Security强制浏览器使用 HTTPS。2.3 敏感数据脱敏已在第四篇详细讲解核心是通过 Jackson 注解自定义序列化对手机号、身份证、邮箱等进行脱敏。补充日志中也要脱敏。使用 Logback 的replace功能pattern%msg%n/patternreplacefrom(\d{3})\d{4}(\d{4})/fromto$1****$2/to/replace三、常见 Web 漏洞与防护3.1 SQL 注入原理拼接用户输入到 SQL 语句中导致恶意代码执行。示例select * from user where name name 若 name 传入 or 11则查询所有用户。防护使用预编译语句PreparedStatement或 ORMMyBatis 使用#{}而非${}。对输入做白名单校验如排序字段只能为id、name等。3.2 XSS跨站脚本攻击原理攻击者注入恶意脚本当其他用户浏览时执行。示例评论框输入scriptalert(xss)/script其他用户查看评论时弹出窗口。防护输出时转义 HTML 实体→lt;。Spring 中可使用HtmlUtils.htmlEscape(text)。设置 HTTP 响应头X-XSS-Protection: 1; modeblock。3.3 CSRF跨站请求伪造原理诱导用户点击恶意链接利用用户的登录态发起非预期请求。示例用户在银行网站登录后访问恶意网站恶意网站自动提交转账请求。防护使用 CSRF Token服务端生成随机 Token 嵌入表单请求时校验。同源检查校验 Referer 或 Origin 头。Spring Security 默认开启 CSRF 防护对 PUT/POST/DELETE 生效。3.4 SSRF服务端请求伪造原理攻击者利用服务端发起请求的功能访问内网资源或绕过防火墙。示例接口fetch?urlhttp://internal-admin/delete可删除内部数据。防护限制请求的 IP 为公网地址禁止访问内网段如 127.0.0.1、10.0.0.0/8。白名单校验 URL 的域名。3.5 文件上传漏洞风险上传可执行脚本JSP、PHP到 Web 目录导致远程代码执行。防护校验文件类型使用Files.probeContentType获取 MIME 类型不要信任文件扩展名。将文件存储到 Web 目录之外通过接口读取并设置响应头。限制文件大小如 10MB。重命名文件避免路径遍历攻击如../../config/application.yml。四、安全审计与日志4.1 操作日志记录记录关键操作登录、权限变更、删除数据的审计日志包含时间、操作人、IP、操作内容、结果。实现使用 AOP第二篇或事件监听机制。4.2 异常监控与告警安全相关异常多次登录失败、越权访问应触发告警。使用 ELK 或 Splunk 集中分析日志设置规则检测可疑行为如短时间内大量请求。4.3 入侵检测思路异常地理登录同一账户短时间内从不同城市登录。暴力破解同一 IP 登录失败超过阈值临时封禁。爬虫识别通过 User-Agent、访问频率、验证码等手段。总结本篇我们构建了后端安全的完整防线认证授权从 Session 到 JWTOAuth2 集成第三方登录RBAC 权限模型。数据安全密码 bcrypt 加密HTTPS 传输敏感数据脱敏。漏洞防护SQL 注入、XSS、CSRF、SSRF、文件上传的防御措施。审计监控操作日志、异常告警、入侵检测。安全没有终点需要持续关注新型漏洞并定期进行渗透测试。将安全编码规范融入日常开发才能防患于未然。全系列回顾第一篇筑基篇——工程骨架与配置管理。第二篇内功篇——Spring 原理与 AOP。第三篇数据库篇——索引优化与事务。第四篇接口篇——高可用 API 设计。第五篇并发篇——线程池与 JUC。第六篇中间件篇——缓存与消息队列。第七篇架构篇——可观测性、质量、云原生。第八篇性能篇——性能优化与线上故障排查。第九篇安全篇——后端安全防护。最后一篇第十篇将作为总结与职业发展篇为整个系列画上圆满句号。如果觉得本文对你有帮助欢迎点赞、收藏、评论你的支持是我持续创作的动力

更多文章