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


原始标题:Prevent Cross-Site Scripting (XSS) in a Spring Application | Baeldung