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注入攻击内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot实现XSS漏洞过滤的示例代码

    背景 前阵子做了几个项目,终于开发完毕,进入了测试阶段,信心满满将项目部署到测试环境,然后做了安全测评之后..... ​(什么!你竟然说我代码不安全???) 然后测出了 Xss漏洞 安全的问题 解决方案 场景:可以在页面输入框输入JS脚本, 攻击者可以利用此漏洞执行恶意的代码 ! 问题演示 ​ ​ 所以我们要对于前端传输的参数做处理,做统一全局过滤处理 既然要过滤处理,我们首先需要实现一个自定义过滤器 总共包含以下四部分 XssUtil XssFilterAutoConfig XssHttpSe

  • Spring Boot XSS 攻击过滤插件使用

    XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS 是一种常见 web 安全漏洞,它允许恶意代码植入到提供给其它用户使用的页面中. xss 攻击流程 简单 xss 攻击示例若网站某个表单没做相关的处理,用户提交相关恶意代码,浏览器会执行相关的代码. 解决方案 XSS 过滤说明 对表单绑定的字符串类型进行 xss 处理. 对 json 字符串数据进行

  • springboot2.x使用Jsoup防XSS攻击的实现

    后端应用经常接收各种信息参数,例如评论,回复等文本内容.除了一些场景下面,可以特定接受的富文本标签和属性之外(如:b,ul,li,h1, h2, h3...),需要过滤掉危险的字符和标签,防止xss攻击. 一.什么是XSS? 看完这个,应该有一个大致的概念. XSS攻击常识及常见的XSS攻击脚本汇总 XSS过滤速查表 二.准则 永远不要相信用户的输入和请求的参数(包括文字.上传等一切内容) 参考第1条 三.实现做法 结合具体业务场景,对相应内容进行过滤,这里使用Jsoup. jsoup是一款Ja

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

    什么是 XSS 攻击 在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本.这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的.攻击者在使用攻击后一般能够: 修改网页内容 将用户重定向到其他网站 访问用户的 Cookie 并利用此信息来冒充用户 访问有关用户系统的关键信息,例如地理位置,网络摄像头,文件系统 将木马功能注入应用程序 如果被攻击的用户在应用程序中具有更高的权限.攻击者可以完全控制应用程序,并破坏所有用户及其数据. XSS 攻击类型 常见的 X

  • SpringBoot通过@Value实现给静态变量注入值详解

    目录 一.简介 二.@Value给静态变量注入值 方案一 方案二 三.总结 一.简介 SpringBoot 中给普通变量注入值只需在变量上添加 @Value 注解即可. application.properties 配置文件有如下配置: mail.name=admin@163.commain.pwd=admin123 给普通变量赋值时,直接在变量声明之上添加 @Value() 注解即可. @Value("${mail.name:admin@163.com}") private Stri

  • Web网络安全分析XSS漏洞原理详解

    目录 XSS基础 XSS漏洞介绍 XSS漏洞原理 反射型XSS 存储型XSS DOM型XSS XSS基础 XSS漏洞介绍 跨站脚本(Cross-Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会收到影响.恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作).私密网页内容.会话和cookie等各种内容. XSS攻击可以分为三种:反射型.存储型和DOM

  • SpringBoot中使用 RabbitMQ的教程详解

    本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 一.Direct直接模式 通过routingKey和exchange决定的那个唯一的queue可以接收消息 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了方便测试,直接在父项目中建立两个子模块(生产者和消费者) 3.pom.xml文件的依赖如下: 父项目: <?xml version="1.0" encoding="U

  • Mockito 结合 Springboot 进行应用测试的方法详解

    Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring Boot可以跟BDD(Behavier Driven Development)工具.Cucumber和Spock协同工作,对应用程序进行测试. 在web应用程序中,我们主要是对Service层做单元测试,以前单元测试都是使用 junit4 ,对Controller层做集成测试或者接口测试,对Controller层的测试一般有两种方法:(1)发送htt

  • Springboot自动扫描包路径来龙去脉示例详解

    我们暂且标注下Springboot启动过程中较为重要的逻辑方法,源码对应的spring-boot-2.2.2.RELEASE版本 public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection<SpringBoo

  • SpringBoot之使用枚举参数案例详解

    接口开发过程中不免有表示类型的参数,比如 0 表示未知,1 表示男,2 表示女.通常有两种做法,一种是用数字表示,另一种是使用枚举实现. 使用数字表示就是通过契约形式,约定每个数字表示的含义,接口接收到参数,就按照约定对类型进行判断,接口维护成本比较大. 在 Spring 体系中,使用枚举表示,是借助 Spring 的 Converter 机制,可以将数字或字符串对应到枚举的序号或者 name,然后将前端的输入转换为枚举类型. 在场景不复杂的场景中,枚举可以轻松胜任. 于是,迅速实现逻辑,准备提

  • SpringBoot实战之处理异常案例详解

    前段时间写了一篇关于实现统一响应信息的博文,根据文中实战操作,能够解决正常响应的一致性,但想要实现优雅响应,还需要优雅的处理异常响应,所以有了这篇内容. 作为后台服务,能够正确的处理程序抛出的异常,并返回友好的异常信息是非常重要的,毕竟我们大部分代码都是为了 处理异常情况.而且,统一的异常响应,有助于客户端理解服务端响应,并作出正确处理,而且能够提升接口的服务质量. SpringBoot提供了异常的响应,可以通过/error请求查看效果: 这是从浏览器打开的场景,也就是请求头不包括content

  • Web网络安全漏洞分析SQL注入原理详解

    目录 一.SQL注入的基础 1.1 介绍SQL注入 1.2 注入的原理 1.3 与MySQL注入相关的知识 MySQL查询语句 limit的用法 需要记住的几个函数 注释符 内联注释 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作. 下面以PHP语句为例. $query = "SELECT * FROM users WH

  • SpringBoot中获取profile的方法详解

    目录 spring boot与profile 静态获取方式 autowire ProfileConfig spring boot与profile spring boot 的项目中不再使用xml的方式进行配置,并且,它还遵循着约定大于配置. 静态获取方式 静态工具类获取当前项目的profile环境. import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte

随机推荐