在 Spring 应用中防止跨站脚本(XSS)攻击

1、概览

在构建 Spring Web 应用时,关注安全性非常重要。跨站脚本 (XSS) 是对 Web 安全威胁最大的攻击之一。

在 Spring 应用中,防止 XSS 攻击是一项挑战。Spring 提供了内置的帮助来实现全面的保护。

本文将带你了解如何通过 Spring Security 使用 X-XSS-ProtectionContent-Security-Policy 机制来防止 XSS 攻击。

2、什么是跨站脚本(XSS)攻击?

2.1、问题的定义

XSS 是一种常见的注入式攻击。在 XSS 中,攻击者试图在 Web 应用程序中执行恶意代码。他们通过 Web 浏览器或 HTTP 客户端工具(如 Postman)与应用交互。

XSS 攻击有两种类型:

  • 反射性或非持久性 XSS
  • 存储型或持久型 XSS

在反射型或非持久型 XSS 中,不受信任的用户数据被提交到 Web 应用,并立即在响应中返回,从而在页面中添加了不可信的内容。Web 浏览器会认为代码来自 Web 服务器并执行它。这可能会让黑客向你发送一个链接,当你点击该链接时,浏览器会从你使用的网站上获取你的私人数据,然后让你的浏览器将这些数据转发到黑客的服务器上。

在存储型或持久型 XSS 中,Web 服务器会存储攻击者的输入。随后,任何后来的访问者都可能执行该恶意代码。

2.2、防御攻击

防止 XSS 攻击的主要策略是清理用户输入。

在 Spring Web 应用中,用户的输入是 HTTP 请求。为防止攻击,应检查 HTTP 请求的内容,并删除可能可在服务器或浏览器中执行的任何内容。

对于通过 Web 浏览器访问的普通 Web 应用,可以使用 Spring Security 的内置功能(反射性 XSS)。

3、使用 Spring Security 防止 XSS 攻击

Spring Security 默认提供多个 Security Header。其中包括 X-XSS-Protection Header 信息。X-XSS-Protection 告诉浏览器阻止看起来像 XSS 的内容。Spring Security 可以自动将此 Security Header 添加到响应中。要激活此功能,需要在 Spring Security 配置类中配置 XSS 支持。

该功能启用后,浏览器在检测到 XSS 尝试时不会进行渲染。不过,有些 Web 浏览器还没有实现 XSS 审计。为了解决这个问题,还可以使用 内容安全策略(CSP) 功能。

CSP 是一个额外的安全层,有助于减轻 XSS 和数据注入攻击。要启用它,需要配置应用,通过提供 SecurityFilterChain Bean 来返回 Content-Security-Policy Header:

@Configuration
public class SecurityConf {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.headers()
            .xssProtection()
            .and()
            .contentSecurityPolicy("script-src 'self'");
        return http.build();
    }
}

关于 Spring Security 配置 CSP 策略的更多细节,可以参考 “Spring Security 配置 Content Security Policy(CSP)”。

4、总结

本文介绍了如何使用 Spring Security 的 xssProtectioncontentSecurityPolicy 功能来防止 XSS 攻击。


Ref:https://www.baeldung.com/spring-prevent-xss