SpringBoot如何防止XSS注入攻击详解

 更新时间:2021年05月11日 14:31:47   作者:maybelence  
这篇文章主要给大家介绍了关于SpringBoot如何防止XSS注入攻击的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是 XSS 攻击

在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用攻击后一般能够:

  • 修改网页内容
  • 将用户重定向到其他网站
  • 访问用户的 Cookie 并利用此信息来冒充用户
  • 访问有关用户系统的关键信息,例如地理位置,网络摄像头,文件系统
  • 将木马功能注入应用程序

如果被攻击的用户在应用程序中具有更高的权限。攻击者可以完全控制应用程序,并破坏所有用户及其数据。

XSS 攻击类型

常见的 XSS 攻击主要有三种:存储型 XSS 攻击,反射型 XSS 攻击和 DOM-based 型 XSS 攻击。

  • 存储型主要是将 XSS 代码保存在服务端(数据库、文件系统等),当用户以后再次请求该资源时重新解析该 XSS 代码,从而出现攻击。
  • 反射型主要发生在一个应用程序使用动态页面向用户显示错误消息时,如果消息中注入了恶意代码就会造成 XSS 反射型攻击。
  • DOM-based 主要是通过脚本直接修改客户端的 DOM 结构,一般这种都是属于前端 JavaScript 的漏洞。

如何阻止 XSS 注入

下面是一个简单的POST方法,模拟创建 Book 并将其保存到数据库中。

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    IBookService bookService;

    @PostMapping
    public void saveBook(@RequestBody Book book) {
        bookService.save(book);
    }
}

我们可以在保存的时候,对 type 值做一段 js 注入,来模拟存储型 XSS 攻击。

现在我们来请求一下,这里的 JavaScript 只会 alert 一个语句,但这种漏洞就有可能被别人利用来注入一些其他的恶意代码:

X-XSS-Protection 响应头

一些浏览器内置了对过滤反射型 XSS 攻击的支持。在一定程度上有助于 XSS 保护。 我们需要在 HTTP 响应头添加如下内容确保已启用该功能,并指示浏览器在检测到 XSS 攻击时进行阻止。

X-XSS-Protection: 1; mode=block

如果你的项目引入了 Spring Security ,那么默认情况下就会自动添加此标头。

添加Content-Security-Policy响应标头

兼容 内容安全策略 浏览器将仅执行从我们的“允许”列出的域接收的源文件中加载的脚本,而忽略所有其他脚本,例如内联脚本。我们可以添加以下标头来启用浏览器的内容安全策略功能。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .csrf().disable()//为了简化示例并更清楚地说明XSS注入,此处禁用了CSRF保护。真实情况请勿使用。
                .authorizeRequests().anyRequest().authenticated()
                .and().httpBasic()
                .and()
                .headers().contentSecurityPolicy("script-src 'self'");
    }
}

以下是所有支持 CSP 的浏览器:

入参验证

我们知道该字段仅需要中文英文和数字字符,因此我们可以使用 Spring 的 Validator 在字段中添加@Pattern注解。

    @NotNull
    @Pattern(message="种类只能支持中文英文数字", regexp = "[\u4e00-\u9fa5_a-zA-Z0-9]+")
    private String type;

然后将 @Valid 添加到接收 Book 的方法中,这样当发生请求时就会自动验证:

@PostMapping
public void saveBook(@RequestBody @Valid Book book) {
    bookService.save(book);
}

客户端

现在主流的几种前端框架,像 Angular 、 React 、 Vue 也可以避免传统开发可能带来的问题:

  • 为了系统地阻止 XSS 错误,默认情况下,Angular 将所有值视为不可信。当通过属性,属性,样式,类绑定或插值将值从模板插入 DOM 时,Angular 会清理并转义不受信任的值。
  • 使用 JSX(React) 可以传递一个函数作为事件处理程序,而不是传递可能包含恶意代码的字符串。
  • React 视图中的字符串变量将自动转义。
  • Vue 的官方文档也有说明, v-html 动态的渲染任意 html 是十分危险的,容易引发 XSS 注入,所以 v-html 永远不要用于用户提交的信息上。

总结

防止 XSS 漏洞主要涉及以下措施的组合:

  • 利用 X-XSS-Protection 响应头,利用浏览器的支持来限制反射的 XSS 攻击。
  • 利用 Content-Security-Policy 响应头来启用浏览器的 CSP 功能。
  • 使用 Validator 对输入信息做相关校验。
  • 客户端方面 React 使用 JSX 传递函数作为事件处理程序,Vue 只在可信内容上使用 v-html ,对用户输入的信息,一定要禁止使用 v-html 。

到此这篇关于SpringBoot如何防止XSS注入攻击的文章就介绍到这了,更多相关SpringBoot防止XSS注入攻击内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于ReentrantLock的实现原理解读

    关于ReentrantLock的实现原理解读

    这篇文章主要介绍了关于ReentrantLock的实现原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java中在时间戳计算的过程中遇到的数据溢出问题解决

    Java中在时间戳计算的过程中遇到的数据溢出问题解决

    这篇文章主要介绍了Java中在时间戳计算的过程中遇到的数据溢出问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 使用nexus3.X上传本地jar包并且通过pom读取的解决方案(全网最新)

    使用nexus3.X上传本地jar包并且通过pom读取的解决方案(全网最新)

    这篇文章主要介绍了使用nexus3.X上传本地jar包并且通过pom读取的解决方案(全网最新),本文内容有点长,结合图文实例给大家讲解的非常详细,需要的朋友可以参考下
    2023-11-11
  • Servlet实现多文件上传功能

    Servlet实现多文件上传功能

    这篇文章主要为大家详细介绍了Servlet实现文件上传功能,还可以实现Servlet多文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java基于装饰者模式实现的染色馒头案例详解

    Java基于装饰者模式实现的染色馒头案例详解

    这篇文章主要介绍了Java基于装饰者模式实现的染色馒头案例,简单描述了装饰者模式的概念、原理及Java使用装饰者模式的相关实现步骤、操作技巧与注意事项,需要的朋友可以参考下
    2018-05-05
  • 一文读懂Spring Bean的生命周期

    一文读懂Spring Bean的生命周期

    今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象,本文让更多的小伙伴们可以轻松的读懂 Spring Bean 的生命周期
    2023-03-03
  • 解决RestTemplate第一次请求响应速度较慢的问题

    解决RestTemplate第一次请求响应速度较慢的问题

    这篇文章主要介绍了解决RestTemplate第一次请求响应速度较慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • BeanUtils.copyProperties复制对象结果为空的原因分析

    BeanUtils.copyProperties复制对象结果为空的原因分析

    这篇文章主要介绍了BeanUtils.copyProperties复制对象结果为空的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现多人聊天室(含界面)

    Java实现多人聊天室(含界面)

    这篇文章主要为大家详细介绍了Java实现多人聊天室,包含界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Spring Boot2.0使用Spring Security的示例代码

    Spring Boot2.0使用Spring Security的示例代码

    这篇文章主要介绍了Spring Boot2.0使用Spring Security的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论