1. 概述
开发 Spring Web 应用时,安全永远是重中之重。其中,跨站脚本攻击(XSS) 是 Web 安全中最常见也最危险的漏洞之一。
虽然防御 XSS 并非易事,但 Spring 提供了内置的安全机制,能帮我们轻松实现全面防护。
本文将重点介绍如何使用 Spring Security 的特性来防范 XSS 攻击。
2. 什么是跨站脚本攻击(XSS)
2.1. 问题定义
XSS 是一种典型的注入攻击方式。攻击者通过向 Web 应用注入恶意脚本,诱使用户的浏览器执行这些代码。
常见的攻击手段包括:
- 用户点击一个链接
- 表单提交包含恶意脚本的数据
- 使用 Postman 等工具发送恶意请求
XSS 主要分为两种类型:
✅ 反射型 XSS(Reflected XSS)
用户输入被服务器立即返回,并在页面中渲染。浏览器误以为这是合法内容并执行脚本。
⚠️ 举个例子:黑客构造一个 URL,你点击后,浏览器悄悄把你 Cookie 发给了黑客的服务器。
✅ 存储型 XSS(Stored XSS)
攻击者输入的内容被服务器保存下来(比如评论、消息等),之后所有访问该页面的用户都会执行这段恶意脚本。
2.2. 防御策略
防御 XSS 的核心思想就是:对用户输入进行清洗和过滤。
在 Spring 应用中,用户输入就是 HTTP 请求。我们要做的就是检查请求内容,把任何可能被浏览器执行的脚本内容干掉。
对于普通的 Web 应用,我们可以借助 Spring Security 提供的内置功能来防御反射型 XSS。
3. 使用 Spring Security 防范 XSS
Spring Security 默认启用了多个安全头,其中包括 X-XSS-Protection
头。这个头部告诉浏览器是否启用 XSS 过滤器。
不过⚠️需要注意的是,现代浏览器如 Chrome 已经逐步弃用了 X-XSS-Protection
,因为它存在一些局限性。
因此,更推荐的做法是使用 内容安全策略(Content Security Policy, CSP) 来增强防护。
下面是一个配置示例,开启 XSS 保护和 CSP 策略:
@Configuration
public class SecurityConf {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.headers(headers ->
headers.xssProtection(
xss -> xss.headerValue(XXssProtectionHeaderWriter.HeaderValue.ENABLED_MODE_BLOCK)
).contentSecurityPolicy(
cps -> cps.policyDirectives("script-src 'self'")
));
return http.build();
}
}
🔍 解读一下关键点:
xssProtection(...)
:启用 XSS 保护头,设置为阻止模式contentSecurityPolicy(...)
:设置 CSP 策略,只允许加载来自本域的脚本(script-src 'self'
)
💡 建议:
- 如果你的前端资源都在本地,可以放心使用
'self'
- 如果用了 CDN 或第三方 JS,记得按需调整策略,否则页面会报错❌
4. 小结
本文介绍了如何利用 Spring Security 提供的 XSS 防护机制,包括:
- 启用
X-XSS-Protection
安全头 - 配置
Content-Security-Policy
增强防护
虽然 Spring Security 能帮你挡住大部分基础攻击,但想真正做到滴水不漏,还需要结合前端编码规范、输入校验、输出转义等多方面措施。
📚 示例源码可从 GitHub 获取:
👉 https://github.com/eugenp/tutorials/tree/master/spring-security-modules/spring-security-core-3