SpringBoot如何使用注解进行XSS防御

 更新时间:2024年11月07日 11:20:42   作者:morris131  
在SpringBoot中,可以通过自定义@XSS注解和实现XSSValidator类来防御XSS攻击,此方法适用于GET和POST请求,通过在方法参数或实体类属性上添加@XSS注解,并结合@Valid或@Validated注解使用,有效拦截潜在的XSS脚本,保障应用安全

在Spring Boot中,我们可以使用注解的方式来进行XSS防御。注解是一种轻量级的防御手段,它可以在方法或字段级别对输入进行校验,从而防止XSS攻击。

引入相关依赖

maven依赖:

<!--JSR-303/JSR-380用于验证的注解 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.6.7</version>
</dependency>

如果是使用grade,引入依赖:

implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.7'

定义@XSS注解进行参数校验

我们可以自定义一个@XSS注解,用于标记那些需要校验的参数。这里是一个简单的@XSS注解定义:

package com.morris.spring.boot.module.xss;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = XssValidator.class)
public @interface Xss {
    String message() default "非法输入, 检测到潜在的XSS";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现自定义注解处理器

接下来,我们需要实现XSSValidator类,该类将负责检查输入是否包含潜在的XSS攻击脚本:

package com.morris.spring.boot.module.xss;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * xss注解校验
 */
public class XssValidator implements ConstraintValidator<Xss, String> {
    /**
     * 使用jsoup自带的relaxed白名单
     */
    private static final Whitelist WHITE_LIST = Whitelist.relaxed();
    /**
     * 定义输出设置,关闭prettyPrint(prettyPrint=false),目的是避免在清理过程中对代码进行格式化
     * 从而保持输入和输出内容的一致性。
     */
    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);
    /**
     * 验证输入值是否有效,即是否包含潜在的XSS攻击脚本。
     * 
     * @param value 输入值,需要进行XSS攻击脚本清理。
     * @param context 上下文对象,提供关于验证环境的信息,如验证失败时的错误消息定制。
     * @return 如果清理后的值与原始值相同,则返回true,表示输入值有效;否则返回false,表示输入值无效。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 这里先对value进行一次解析,对其中的单个<、>字符进行编码
        String oldBody = Jsoup.parse(value).body().html();
        // 使用Jsoup库对输入值进行清理,以移除潜在的XSS攻击脚本。
        // 使用预定义的白名单和输出设置来确保只保留安全的HTML元素和属性。
        String newBody = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);
        // 比较清理后的值与解析后的值是否相同,不相同说明过滤了xss脚本
        // 这里不使用value与newBody比,因为jsoup会对value中的单个<、>字符进行编码,如果value中还有单个的<,value与newBody也会不一样
        return oldBody.equals(newBody);
    }
}

使用@Xss注解防御post请求

如果是post请求,需要在方法参数前面加上@Valid或者@Validated注解,然后在实体类的属性上面加上@Xss注解。

package com.morris.spring.boot.module.xss;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * Xss局部防御post请求
 */
@RestController
@RequestMapping("/xss/local")
public class XssLocalPostController {
    /**
     * 使用注解拦截POST请求中的xss,在实体类需要拦截xss的属性上面加上@Xss或者@Validated注解
     *
     * @param userLocalLoginPojo 实体类
     * @return 实体类
     */
    @PostMapping("/test")
    public UserLocalLoginPojo test(@Valid @RequestBody UserLocalLoginPojo userLocalLoginPojo) {
        return userLocalLoginPojo;
    }
}

在要进行XSS防御的属性上添加@Xss注解:

package com.morris.spring.boot.module.xss;
import lombok.Data;
@Data
public class UserLocalLoginPojo {
    @Xss
    private String userAccount;
}

测试url:http://localhost:8888/xss/local/test

测试post请求:

{
    "userAccount": "<iframe οnlοad='alert(0)'>demoData</iframe>"
}

测试结果:

{
    "message": "userAccount:非法输入, 检测到潜在的XSS",
    "code": 400,
    "result": null
}

使用@Xss注解防御get请求

如果是get请求,需要在方法参数前面加上@Xss注解,然后在类上加上@Validated注解。

package com.morris.spring.boot.module.xss;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * Xss局部防御get请求
 */
@RestController
@RequestMapping("/xss/local")
@Validated
public class XssLocalGetController {
    /**
     * 使用注解拦截get请求中的xss,在方法参数前面加上@Xss,注意类上面要加上@Validated注解
     *
     * @param userAccount 请求参数
     * @return 请求参数
     */
    @GetMapping("/test")
    public String test(@Xss String userAccount) {
        return userAccount;
    }
}

测试url:http://localhost:8888/xss/local/test?userAccount=<iframe>demoData</iframe>

测试结果:

{
    "message": "test.userAccount: 非法输入, 检测到潜在的XSS",
    "code": 400,
    "result": null
}

到此这篇关于SpringBoot使用注解进行XSS防御的文章就介绍到这了,更多相关SpringBoot XSS防御内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java 类的加载、连接和初始化

    详解Java 类的加载、连接和初始化

    这篇文章主要介绍了Java 类的加载、连接和初始化的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Springcloud Nacos基本操作代码实例

    Springcloud Nacos基本操作代码实例

    这篇文章主要介绍了Springcloud Nacos基本操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java详解IO流创建读取与写入操作

    Java详解IO流创建读取与写入操作

    这篇文章主要介绍了Java IO流,同时也介绍了流中的一些相关的内容,并且通过大量的案例供大家理解。最后通过一些经典的案例帮助大家对前面所学的知识做了一个综合的应用,需要的朋友可以参考一下
    2022-05-05
  • Java 单例模式的实现资料整理

    Java 单例模式的实现资料整理

    这篇文章主要介绍了Java 单例模式的实现的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-10-10
  • 搭建公司私有MAVEN仓库的方法

    搭建公司私有MAVEN仓库的方法

    这篇文章主要介绍了搭建公司私有MAVEN仓库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java中synchronized关键字引出的多种锁 问题

    Java中synchronized关键字引出的多种锁 问题

    synchronized关键字是JAVA中常用的同步功能,提供了简单易用的锁功能。这篇文章主要介绍了Java中synchronized关键字引出的多种锁问题,需要的朋友可以参考下
    2019-07-07
  • Java填充替换数组元素实例详解

    Java填充替换数组元素实例详解

    这篇文章主要通过两个实例说明Java填充和替换数组中元素的方法,需要的朋友可以参考下。
    2017-08-08
  • java二叉树的遍历方式详解

    java二叉树的遍历方式详解

    这篇文章主要为大家详细介绍了java实现二叉树遍历的四种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • Java设计模式之外观模式示例详解

    Java设计模式之外观模式示例详解

    外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节。本文将通过示例详细为大家讲解一下外观模式,需要的可以参考一下
    2022-08-08
  • 简单了解spring cloud 网关服务

    简单了解spring cloud 网关服务

    这篇文章主要介绍了简单了解spring cloud 网关服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论