【SpringBoot应用篇】SpringBoot集成AntiSamy防御XSS(跨站脚本攻击)--过滤器实现

news2024/11/22 1:18:09

【SpringBoot应用篇】SpringBoot集成AntiSamy防御XSS(跨站脚本攻击)--过滤器实现

  • XSS介绍
  • AntiSamy介绍
  • AntiSamy使用
    • pom
    • User
    • UserController
    • XssFilter
    • XssRequestWrapper
    • 配置类

XSS介绍

XSS:跨站脚本攻击(Cross Site Scripting),为不和 CSS混淆,故将跨站脚本攻击缩写为XSS。XSS是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。有点类似于sql注入。

XSS攻击原理:

HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

AntiSamy介绍

AntiSamy是OWASP的一个开源项目,通过对用户输入的 HTML / CSS / JavaScript 等内容进行检验和清理,确保输入符合应用规范。AntiSamy被广泛应用于Web服务对存储型和反射型XSS的防御中。

<dependency>
  <groupId>org.owasp.antisamy</groupId>
  <artifactId>antisamy</artifactId>
  <version>1.5.7</version>
</dependency>

AntiSamy使用

pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.owasp.antisamy</groupId>
    <artifactId>antisamy</artifactId>
    <version>1.5.7</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

User

@Data
public class User {
    private int id;
    private String name;
    private int age;
}

UserController

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save")
    public String save(User user){
        System.out.println("UserController save.... " + user);
        return user.getName();
    }
}

此时我们可以启动项目进行访问,但是还没有进行参数的过滤,所以如果我们输入任意参数都可以正常传递到Controller中,这在实际项目中是非常不安全的。为了对我们输入的数据进行过滤清理,需要通过过滤器来实现。

XssFilter

创建过滤器,用于过滤所有提交到服务器的请求参数

public class XssFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        //传入重写后的Request
        filterChain.doFilter(new XssRequestWrapper(request),servletResponse);
    }
}

注意:通过上面的过滤器可以发现我们并没有在过滤器中直接进行请求参数的过滤清理,而是直接放行了,那么我们还怎么进行请求参数的过滤清理呢?其实过滤清理的工作是在另外一个类XssRequestWrapper中进行的,当上面的过滤器放行时需要调用filterChain.doFilter()方法,此方法需要传入请求Request对象,此时我们可以将当前的request对象进行包装,而XssRequestWrapper就是Request对象的包装类,在过滤器放行时会自动调用包装类的getParameterValues方法,我们可以在包装类的getParameterValues方法中进行统一的请求参数过滤清理。

XssRequestWrapper

1、jar包自带了策略文件,选择antisamy-ebay.xml复制到resouce目录下
在这里插入图片描述

public class XssRequestWrapper extends HttpServletRequestWrapper {
    /**
     * 策略文件 需要将要使用的策略文件放到项目资源文件路径下
     * */
    private static String antiSamyPath = XssRequestWrapper.class.getClassLoader().getResource( "antisamy-ebay.xml").getFile();

    public static  Policy policy = null;
    static {
        // 指定策略文件
        try {
            policy = Policy.getInstance(antiSamyPath);
        } catch (PolicyException e) {
            e.printStackTrace();
        }
    }

    /**
     * AntiSamy过滤数据
     * @param taintedHTML 需要进行过滤的数据
     * @return 返回过滤后的数据
     * */
    private String xssClean( String taintedHTML){
        try{
            // 使用AntiSamy进行过滤
            AntiSamy antiSamy = new AntiSamy();
            CleanResults cr = antiSamy.scan( taintedHTML, policy);
            taintedHTML = cr.getCleanHTML();
        }catch( ScanException e) {
            e.printStackTrace();
        }catch( PolicyException e) {
            e.printStackTrace();
        }
        return taintedHTML;
    }

    public XssRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    @Override
    public String[] getParameterValues(String name){
        String[] values = super.getParameterValues(name);
        if ( values == null){
            return null;
        }
        int len = values.length;
        String[] newArray = new String[len];
        for (int j = 0; j < len; j++){
            // 过滤清理
            newArray[j] = xssClean(values[j]);
        }
        return newArray;
    }

    @Override
    public String getParameter(String paramString) {
        String str = super.getParameter(paramString);
        if (str == null) {
            return null;
        }
        return xssClean(str);
    }


    @Override
    public String getHeader(String paramString) {
        String str = super.getHeader(paramString);
        if (str == null) {
            return null;
        }
        return xssClean(str);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> requestMap = super.getParameterMap();
        for (Map.Entry<String, String[]> me : requestMap.entrySet()) {
            String[] values = me.getValue();
            for (int i = 0; i < values.length; i++) {
                values[i] = xssClean(values[i]);
            }
        }
        return requestMap;
    }
}

配置类

为了使上面定义的过滤器生效,需要创建配置类,用于初始化过滤器对象

@Configuration
public class AntiSamyConfiguration {
    /**
     * 配置跨站攻击过滤器
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(new XssFilter());
        filterRegistration.addUrlPatterns("/*");
        filterRegistration.setOrder(1);
        Map<String, String> initParameters = new HashMap<>(2);
        String excludes = new StringJoiner(",")
                .add("/favicon.ico")
                .add("/doc.html")
                .add("/swagger-ui.html")
                .add("/csrf")
                .add("/webjars/*")
                .add("/v2/*")
                .add("/swagger-resources/*")
                .add("/resources/*")
                .add("/static/*")
                .add("/public/*")
                .add("/classpath:*")
                .add("/actuator/*")
                .toString();
        initParameters.put("excludes", excludes);
        initParameters.put("isIncludeRichText", "true");
        filterRegistration.setInitParameters(initParameters);
        return filterRegistration;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4、MYSQL常用函数(字符串)

目录 abs&#xff08;x&#xff09;&#xff1a;返回x的绝对值 ceil&#xff08;x&#xff09;&#xff1a;返回大于x的最小整数 floor&#xff08;x&#xff09;&#xff1a;返回小于x的最大整数 mod&#xff08;x,y&#xff09;&#xff1a;返回x/y的模 Rand&#xff08;&a…

分析激光焊接机焊接不牢固的原因

激光焊接机在焊接时为什么会出现焊接不牢固呢&#xff1f;是不是激光焊接设备出现问题了&#xff1f;当激光焊接机进行焊接加工时&#xff0c;出现材料之间的焊接不牢固这会影响整体质量。这时&#xff0c;用户不可避免地会质疑激光焊接机的效果我们也是可以理解的。实质出现激…

javaEE初阶---多线程(初阶)

一 : 学习目标 认识多线程掌握多线程程序的编写掌握多线程的状态掌握什么是线程不安全及解决思路掌握synchronized、volatile关键字 二 : 初识线程 2.1 线程概念 线程&#xff08;thread&#xff09;是操作系统能够进行运算调度的最小单位.它被包含在进程之中&#xff0c;是进…

django使用二——restful框架使用

背景 前言&#xff1a; 前篇django使用一&#xff0c;已将基本的项目、应用创建并运行&#xff1b;见&#xff1a;django使用一——规范化创建 本篇则针对ViewSet及rest_framework初使用做介绍&#xff1b; 闲笔&#xff1a; 两束平行宇宙射线射入黑盒&#xff0c;在人们充满…

《计算机网络》——第六章知识点

第六章思维导图如下&#xff1a; 应用层对应用程序的通信提供服务。 域名解析:根据域名找IP地址 域名结构 FTP是基于客户/服务器(C/S)的协议。 用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务&#xff0c;进行文件传送的计算机就是FTP服…

对象类型的设计(简答题)

在实际项目开发中需要进行对象类型的设计&#xff0c;给你的问题是&#xff0c;在学生信息系统中需要你设计班级Classes类型和学生Student类型&#xff0c;为了便于数据的查询&#xff0c;需要建立对象之间的联系&#xff0c;比如一个班级有多个学生&#xff0c;每个学生属于一…

看完这篇,我不允许你还不会用Allegro显示PCB的3D模式

看完这篇,我不允许你还不会用Allegro显示PCB的3D模式 Allegro可以显示PCB的3D效果,利于查看和检查,如下图 具体操作如下 选择Set-up-user preferences选择Display

游戏党别错过,提升FPS试试这样

如果你准备畅玩游戏&#xff0c;却频繁掉帧&#xff0c;严重影响游戏体验&#xff0c;那这里有些提升FPS的小方法&#xff0c;游戏党别错过了。 整理主硬盘更改电源选项更新显卡驱动降低屏幕分辨率关闭其他应用程序并禁用启动项 方法一、整理主硬盘 1、打开文件资源管理器&am…

APP Inventor练习——蓝牙通信

文章目录前言一、蓝牙调试1.组件设计2.逻辑设计二、蓝牙对战1.组件设计2.逻辑设计3.效果展示总结前言 练习APP Inventor中蓝牙的使用&#xff0c;并为之前的项目APP小游戏——一个都不能死增加了蓝牙对战功能。 一、蓝牙调试 先写一个蓝牙调试的APP&#xff0c;用来收发文本 …

2023年七大网络攻击手段预测

受疫情和网络攻击的加持下&#xff0c;2022年对网络安全领域的人来说并不是轻松的一年&#xff0c;一系列备受瞩目的网络攻击、数据泄露事件打的网安人手忙脚乱&#xff0c;供应链攻击、勒索软件攻击、业务欺诈、关键基础设施攻击、大规模数据泄露、地缘政治相关黑客攻击等网络…

热点舆情监测软件方法,舆情监测软件介绍,舆情软件监测意义?

热点舆情监测是指监测和分析当前热门话题或事件的舆情监测。这种监测可以帮助企业、政府机构或媒体机构了解公众对当前热门话题或事件的看法&#xff0c;接下来TOOM舆情监测小编简单介绍热点舆情监测软件方法&#xff0c;舆情监测软件介绍&#xff0c;舆情软件监测意义? 一、…

java8后接口的默认方法

这里我们先看一个案例 我们创建一个包 包下创建一个接口 testInterface 参考代码如下 public interface testInterface {void show(); }然后 我们创建一个类型 realizationMethod 来实现这个接口 并重写这个show方法 realizationMethod 参考代码如下 public class realizat…

腊八节吃什么What to eat on the Laba Festival

农历十二月初八是中国的传统节日——腊八节&#xff0c;腊代表中国农历的十二月&#xff0c;而八是eight的发音&#xff0c;因此&#xff0c;这个节日被翻译成腊八。 The Laba Festival is a traditional Chinese holiday celebrated on the eighth day of the twelfth month …

Selenium switch_to 处理多Web页签窗口与封装

目录 前言 脚本案例 未做页签切换处理的 做了页签切换处理的脚本 面签切换封装 1、按面签位置切换封装 2、按页签标题切换封装 3、两个封装的调用 前言 在做自动化测试时&#xff0c;经常会遇到一个链接&#xff0c;它会重新打开一个Web签&#xff0c;如下图的样式 如…

Tif地形数据下载CTB切片nginx发布及cesium调用

访问这个网站&#xff1a;https://urs.earthdata.nasa.gov/ 需要注册 选择数据类型如下 点击Search,可以看到很多搜索结果 点击下载一项tif 下载成功后&#xff0c;需要切片的话&#xff0c;可以选择两种方式 1CesiumLab3,如下图 可以选择多个tif&#xff0c;输出类型选择散…

LeetCode118.杨辉三角 | LeetCode119.杨辉三角Ⅱ

LeetCode刷题记录 文章目录&#x1f4dc;杨辉三角Ⅰ⌨C代码&#x1f4dc;杨辉三角Ⅱ⌨C代码&#x1f4dc;杨辉三角Ⅰ 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例1 输入: n…

Linux进程间通信

1.进程间通信介绍 1.1进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程。资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某…

深度学习入门(六十六)循环神经网络——束搜索

深度学习入门&#xff08;六十六&#xff09;循环神经网络——束搜索&#xff09;前言循环神经网络——束搜索课件贪心搜索穷举搜索束搜索总结教材1 贪心搜索2 穷举搜索3 束搜索4 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用&#xff0c;防止遗忘…

MySQL批量导入数据时,为何表空间膨胀了N倍

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;叶金荣文章来源&#xff1a;GreatSQL社区原创 问题缘起 同事在客户现场利用DTS工具&#xff0c;从A实例将数据…

I2C(IIC)的仲裁、时钟同步和时钟扩展

I2C&#xff08;IIC&#xff09;的仲裁、时钟同步和时钟扩展 注意&#xff0c;CSDN以及博客园上有大量抄袭和以讹传讹的情况&#xff0c;注意鉴别。 本文参考了Philip的I2C specification以及wiki pedia&#xff0c;并且通过实践验证。 阅读本文要求你已经对i2c的协议有基本的…