Spring Boot 应用部署安全实践指南
一句话总结:安全不是一次性任务,而是一个持续的过程。
本指南从 传输层安全、应用层安全、依赖与运维安全 三个维度,结合 Spring Boot 的最佳实践,协助你构建纵深防御的安全体系。
核心安全实践概览
|
安全领域 |
威胁 |
防护措施 |
Spring Boot 实践 |
|
传输安全 (HTTPS) |
窃听、中间人攻击 |
加密通信通道 |
配置 SSL/TLS,强制 HTTP → HTTPS |
|
认证与授权 |
未授权访问 |
控制访问权限 |
Spring Security,密码使用 BCrypt 哈希 |
|
CSRF |
跨站请求伪造 |
校验请求合法性 |
Spring Security 内置 CSRF Token |
|
XSS |
跨站脚本注入 |
输入验证 + 输出编码 |
Bean Validation、Jsoup 清洗、CSP |
|
SQL 注入 |
数据库攻击 |
参数化查询 |
JPA / Hibernate / MyBatis 的预编译语句 |
|
依赖安全 |
第三方漏洞 |
检测与升级 |
OWASP Dependency-Check,定期更新 |
|
HTTP 安全头 |
浏览器端攻击 |
浏览器内置防护 |
HSTS、X-Content-Type-Options、CSP |
1. 传输层安全:启用 HTTPS
步骤 1:申请证书
- 生产环境:使用 CA 签发的证书(Let’s Encrypt 免费、DigiCert 等)
- 测试环境:自签证书
keytool -genkey -alias mydomain -keyalg RSA
-keystore keystore.p12 -storetype PKCS12 -validity 365
步骤 2:Spring Boot 配置
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-secret-password
server.ssl.key-alias=mydomain
步骤 3:强制 HTTPS
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
return http.build();
}
2. 应用层安全:Spring Security
2.1 认证与密码存储
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// user.setPassword(passwordEncoder.encode(rawPassword));
2.2 防护 CSRF
- 默认开启:Spring Security 为每个会话生成 CSRF Token
- 表单项目:Thymeleaf 自动带上 Token
- 前后端分离:需从 Cookie/响应头中读取 Token,带入 X-CSRF-TOKEN 请求头
⚠️ 只有无状态 API 服务时才思考关闭:
http.csrf(csrf -> csrf.disable()); // 不推荐
3. 输入输出安全:XSS 与 SQL 注入
3.1 防护 XSS
- 输入验证:JSR-303 注解 (@NotBlank, @Email)
- 富文本清洗:
String safeHtml = Jsoup.clean(unsafeHtml, Whitelist.basicWithImages());
- 输出转义:Thymeleaf 默认 th:text 转义
- CSP 策略:
http.headers(headers -> headers
.addHeaderWriter(new StaticHeadersWriter(
"Content-Security-Policy",
"default-src 'self'; script-src 'self' https://cdn.safe.com;")));
3.2 防护 SQL 注入
- JPA 示例
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
- MyBatis 示例
<select id="findUser" resultType="User">
SELECT * FROM user WHERE username = #{username}
</select>
<!-- 绝对不要用 ${} 拼接 SQL -->
4. 依赖安全与漏洞扫描
OWASP Dependency-Check (Maven)
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.2.1</version>
<executions>
<execution>
<goals><goal>check</goal></goals>
</execution>
</executions>
</plugin>
执行:
mvn verify
mvn dependency-check:check
依赖更新检查:
mvn versions:display-dependency-updates
5. HTTP 安全头配置
http.headers(headers -> headers
.contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'"))
.httpStrictTransportSecurity(hsts -> hsts
.includeSubDomains(true).maxAgeInSeconds(31536000))
.frameOptions(frame -> frame.sameOrigin())
.xssProtection(xss -> xss
.headerValue(XXssProtectionHeaderWriter.HeaderValue.ENABLED_MODE_BLOCK))
.contentTypeOptions(contentType -> {})
);
常用安全头
- HSTS:强制 HTTPS
- X-Frame-Options:防点击劫持
- X-Content-Type-Options:防 MIME 嗅探
- CSP:核心 XSS 防御手段
6. 纵深防御总结
- 网络层:HTTPS、防火墙
- 系统层:最小化权限、定期更新
- 应用层:Spring Security、CSRF、XSS、SQL 注入防护
- 依赖层:依赖扫描、漏洞修复
- 运维层:Actuator 加固、日志审计
上线前用 OWASP ZAP 或 Burp Suite 进行渗透测试,能提前发现大部分隐患。
这份指南相当于一个 Spring Boot 安全全景手册,从证书、到 CSRF/XSS/SQL 注入、再到依赖与 HTTP 头,都覆盖了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。




收藏了,感谢分享