44. 从零开始学springboot撸一个Xss过滤器-Filter实现

Springboot 防止XSS攻击,包含解决RequestBody 的Json 格式参数 一、前言 最近项目做安全测试,发现存在XSS攻击的可能,于是乎上网找找看,找了很多基本都是继承HttpServletRequestWrapper,对getParam、getQueryString等获取参数的方法进行重写,对参数进行html转义,马上找一个加上试了试,可是发现保存的对象还是没有转义的,后来才想到项目是前后端分离,基本都是@RequestBody注解接收application/jso...... 阅读详情

前言

项目安全需要, 需要全局对参数进行xss过滤处理.

Xss简介

关于Xss很多人可能都有了解, 出于“礼貌”,

咸鱼君还是简单举个例子

用户注册时可以填写姓名

此时我填写了“” 并提交,

后端呢没有做任何检测就保存了.

那么就可能有问题, 下次再访问这个页面你会发现不停的弹窗“1”!

Xss攻击呢也分很多种, 感兴趣的自行查阅资料, 这里不多说了.

那么如何面对Xss攻击呢?

其实也很好解决, 一句话“不要相信用户的任何输入”!

编程上就是对用户的提交内容进行过滤以及非法字符的“转义”!

Springboot Xss拦截器实现

对整个系统的提交进行过滤和转义, 如过针对每个点分别调用某个方法去做这件事, 会显得很麻烦, 而且, 重复的代码看着也不美观, 所以, 这里就采用Springboot+Filter的方式实现一个Xss的全局过滤器.

Springboot实现一个Xss过滤器, 常用的有两种方式:

  • 重写HttpServletRequestWrapper
    重写getHeader()、getParameter()、getParameterValues()、getInputStream()实现对传统“键值对”传参方式的过滤
    重写getInputStream()实现对Json方式传参的过滤,也就是@RequestBody参数.

  • 自定义序列化器, 对MappingJackson2HttpMessageConverter 的objectMapper做设置.
    重写JsonSerializer.serialize()实现对出参的过滤 (PS: 数据原样保存, 取出来的时候转义)
    重写JsonDeserializer.deserialize()实现对入参的过滤 (PS: 数据转义后保存)

针对以上两种方式有几个注意点:

问题一: json参数(@RequestBody)的处理

针对Json方式传参 ,
springmvc默认使用jackjson做序列化.
重写getInputStream()来实现xss过滤时,
如果你对参数替换了双引号, jackjson序列/反序列化参数时会报错,
因为它不认识这个格式!
所以我们对参数处理时要剔除双引号!
或者, 你选择自定义序列化器来实现json参数的处理.

问题二: 自定义序列化器

虽然我们入参和出参两种方式都写了案例,
实际上只需要选择其一来做即可!没必要两种都做过滤.
这里推荐对入参进行处理, 理由如下:

  1. 重写getHeader()、getParameter()、getParameterValues()是直接对入参进行转义,
    也就是你后续程序获取的参数都是转义后的,
    所以, 为了全局统一, 我们对@RequestBody类型的参数也进行入参处理.

  2. 对入参转义意味着保存进DB的就是“安全”的数据

本次案例实现原理如下:

  • 针对“键值对”参数采用重写HttpServletRequestWrapper过滤
  • 针对json参数采用自定义序列化器来过滤

PS: 针对json参数也实现了getInputStream()方式的过滤(代码为注释状态)

实现

首先, 我们先引入一个工具包, 就是大名鼎鼎的“糊涂”工具包, 该包集成了大量的好用的工具!强烈推荐使用!

<!--HuTool工具包 -->
<dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.2.3</version>
</dependency>

我们用到HuTool内的EscapeUtil这个工具来转义特殊字符.

使用HttpServletRequestWrapper重写Request请求参数

package com.mrcoder.sbxssfilter.config.xss;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.EscapeUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * XSS过滤处理
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    /**
     * 描述 : 构造函数
     *
     * @param request 请求对象
     */
    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }


    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        return EscapeUtil.escape(value);
    }

    //重写getParameter
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        return EscapeUtil.escape(value);
    }

    //重写getParameterValues
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values != null) {
            int length = values.length;
            String[] escapseValues = new String[length];
            for (int i = 0; i < length; i++) {
                escapseValues[i] = EscapeUtil.escape(values[i]);
            }
            return escapseValues;
        }
        return super.getParameterValues(name);
    }

//    //重写getInputStream,对json格式参数进行过滤(也就是@RequestBody类型的参数)
//    @Override
//    public ServletInputStream getInputStream() throws IOException {
//        // 非json类型,直接返回
//        if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {
//            return super.getInputStream();
//        }
//
//        // 为空,直接返回
//        String json = IoUtil.read(super.getInputStream(), "utf-8");
//        if (StrUtil.isEmpty(json)) {
//            return super.getInputStream();
//        }
//        // 这里要注意,json格式的参数不能直接使用hutool的EscapeUtil.escape, 因为它会把"也给转义,
//        // 使得@RequestBody没办法解析成为一个正常的对象,所以我们自己实现一个过滤方法
//        // 或者采用定制自己的objectMapper处理json出入参的转义(推荐使用)
//        json = cleanXSS(json).trim();
//        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
//        return new ServletInputStream() {
//            @Override
//            public boolean isFinished() {
//                return true;
//            }
//
//            @Override
//            public boolean isReady() {
//                return true;
//            }
//
//            @Override
//            public void setReadListener(ReadListener readListener) {
//            }
//
//            @Override
//            public int read() {
//                return bis.read();
//            }
//        };
//    }
//
//    public static String cleanXSS(String value) {
//        value = value.replaceAll("&", "%26");
//        value = value.replaceAll("<", "%3c");
//        value = value.replaceAll(">", "%3e");
//        value = value.replaceAll("'", "%27");
//        //value = value.replaceAll(":", "%3a");
//        //value = value.replaceAll("\"", "%22");
//        //value = value.replaceAll("/", "%2f");
//        return value;
//    }

}

实现一个过滤器

package com.mrcoder.sbxssfilter.config.xss;

import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 防止XSS攻击的过滤器
 */
@Component
public class XssFilter implements Filter {
    /**
     * 排除链接
     */
    private List<String> excludes = new ArrayList<>();

    /**
     * xss过滤开关
     */
    private boolean enabled = false;

    @Override
    public void init(FilterConfig filterConfig) {
        String tempExcludes = filterConfig.getInitParameter("excludes");
        String tempEnabled = filterConfig.getInitParameter("enabled");
        if (StrUtil.isNotEmpty(tempExcludes)) {
            String[] url = tempExcludes.split(",");
            Collections.addAll(excludes, url);
        }
        if (StrUtil.isNotEmpty(tempEnabled)) {
            enabled = Boolean.valueOf(tempEnabled);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (handleExcludeUrl(req)) {
            chain.doFilter(request, response);
            return;
        }
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
        chain.doFilter(xssRequest, response);
    }

    /**
     * 判断当前路径是否需要过滤
     */
    private boolean handleExcludeUrl(HttpServletRequest request) {
        if (!enabled) {
            return true;
        }
        if (excludes == null || excludes.isEmpty()) {
            return false;
        }
        String url = request.getServletPath();
        for (String pattern : excludes) {
            Pattern p = Pattern.compile("^" + pattern);
            Matcher m = p.matcher(url);
            if (m.find()) {
                return true;
            }
        }
        return false;
    }
}

配置并注册过滤器

package com.mrcoder.sbxssfilter.config.xss;

import javax.servlet.DispatcherType;

import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author xssfilter配置
 */
@Configuration
public class XssFilterConfig {
    @Value("${xss.enabled}")
    private String enabled;

    @Value("${xss.excludes}")
    private String excludes;

    @Value("${xss.urlPatterns}")
    private String urlPatterns;

    @SuppressWarnings({"rawtypes", "unchecked"})
    @Bean
    public FilterRegistrationBean xssFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new XssFilter());
        //添加过滤路径
        registration.addUrlPatterns(StrUtil.split(urlPatterns, ","));
        registration.setName("xssFilter");
        registration.setOrder(Integer.MAX_VALUE);
        //设置初始化参数
        Map<String, String> initParameters = new HashMap<String, String>();
        initParameters.put("excludes", excludes);
        initParameters.put("enabled", enabled);
        registration.setInitParameters(initParameters);
        return registration;
    }

    /**
     * 过滤json类型的
     *
     * @param builder
     * @return
     */
    @Bean
    @Primary
    public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
        //解析器
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        //注册xss解析器
        SimpleModule xssModule = new SimpleModule("XssStringJsonDeserializer");

        //入参和出参过滤选一个就好了,没必要两个都加
        //这里为了和XssHttpServletRequestWrapper统一,建议对入参进行处理
        //注册入参转义
        xssModule.addDeserializer(String.class, new XssStringJsonDeserializer());
        //注册出参转义
        //xssModule.addSerializer(new XssStringJsonSerializer());
        objectMapper.registerModule(xssModule);
        //返回
        return objectMapper;
    }
}

最后,我们在配置文件加上

#是否打开
xss.enabled=true
#不过滤路径, 以逗号分割
xss.excludes=/open/*,/open2/*
//过滤路径, 逗号分割
xss.urlPatterns=/*

另外, 我们需要实现一个ObjectMapper来处理json格式的参数

处理json入参的转义

package com.mrcoder.sbxssfilter.config.xss;

import cn.hutool.core.util.EscapeUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

/**
 * 处理json入参的转义
 */
public class XssStringJsonDeserializer extends JsonDeserializer<String> {

    @Override
    public Class<String> handledType() {
        return String.class;
    }

    //对入参转义
    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        String value = jsonParser.getText();
        if (value != null) {
            return EscapeUtil.escape(value);
        }
        return value;
    }

}

处理json出参的转义

package com.mrcoder.sbxssfilter.config.xss;

import cn.hutool.core.util.EscapeUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 处理json出参的转义
 */
public class XssStringJsonSerializer extends JsonSerializer<String> {

    @Override
    public Class<String> handledType() {
        return String.class;
    }

    //对出参转义
    @Override
    public void serialize(String value, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        if (value != null) {
            String encodedValue = EscapeUtil.escape(value);
            jsonGenerator.writeString(encodedValue);
        }
    }

}

写个测试

package com.mrcoder.sbxssfilter.model;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class People {
    private String name;
    private String info;
}

package com.mrcoder.sbxssfilter.controller;


import com.mrcoder.sbxssfilter.model.People;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class XssController {

    //键值对
    @PostMapping("xssFilter")
    public String xssFilter(String name, String info) {
        log.error(name + "---" + info);
        return name + "---" + info;
    }
    //实体
    @PostMapping("modelXssFilter")
    public People modelXssFilter(@RequestBody People people) {
        log.error(people.getName() + "---" + people.getInfo());
        return people;
    }

    //不转义
    @PostMapping("open/xssFilter")
    public String openXssFilter(String name) {
        return name;
    }

    //不转义2
    @PostMapping("open2/xssFilter")
    public String open2XssFilter(String name) {
        return name;
    }
}

json方式
image.png

键值对方式
image.png

项目地址

https://github.com/MrCoderStack/SpringBootDemo/tree/master/sb-xssfilter

请关注我的订阅号

订阅号.png

SpringBoot项目XSS攻击过滤防御实现 一、先来个简介# 什么是XSS? 百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 二、XSS分类# xss攻击可以分成两种类型: 1.非 阅读详情

相关推荐

二次元商城源码拆解:从跑通到改造成毕业设计技术底稿

SpringBoot 与 MyBatis 构建的 Java Web 单体架构是电商系统开发的经典入门实践,其核心在于通过事务与乐观锁保障数据一致性。在二次元商品购物商城场景中,商品、购物车与订单模块的串联涉及分页查询、库存扣减及全局过滤器等关键技术点。掌握这些基础原理,不仅能快速搭建可演示的电商系统,还能应对 Java 基础面试与毕业设计答辩中的追问。本文围绕二次元商城源码,按先跑通、再拆解、后改造的顺序,深入剖析 SpringBoot 配置、数据一致性及工程化改造的实操路径。

weixin_33831196的博客 447

Springboot配置XSS过滤器XssFilter

Springboot配置XSS过滤器XssFilter

qq_44691484的博客 4898

DeepSeek多模态文件解析实战:PDF/Word表格与图表结构化提取

多模态文档处理是指将文本、表格、图表等异构信息统一建模并联合解析的技术范式。其核心原理在于构建几何-语义联合空间,实现跨模态元素(如‘图3-2’标题与对应柱状图)的语义对齐与数据关联。相比传统单模态工具(如pdfplumber、POI)的割裂式处理,多模态方案显著提升复杂文档(货运单据、财报、科研论文)的结构化准确率与工程可用性。典型应用场景包括PDF转结构化表格、Word图表数据复用、扫描件智能审核等。本文聚焦DeepSeek文件处理API,详解其在真实业务场景中如何实现表格Schema识别、可执行图表J

weixin_34234829的博客 272

XSS攻击

XSS是什么 Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。 为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS。 一、XSS注入的方法: 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字

weixin_46015266的博客 401

Springboot配置XSS过滤器XssFilter.zip

直接可以运行,包含测试类,对HTML和SQL进行过滤,方便扩展。并且可以配置不拦截的路径,包含注释,方便学习。 博客地址:https://blog.csdn.net/u011974797/article/details/121792680

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 228

Spring Boot之FilterRegistrationBean-自定义Filter详解

Spring Boot之FilterRegistrationBean-自定义Filter详解

gb4215287的博客 1750

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

SpringBoot+Vue3前后端分离新闻稿件管理系统实战与部署指南

前后端分离架构是现代Web系统开发的常见模式,它将前端界面与后端服务解耦,各自独立开发、部署。SpringBoot作为Java后端主流框架,通过自动装配简化了企业级应用构建,Vue3配合Vite则提供了高效的组件化前端开发体验。结合MyBatis的灵活SQL控制和MySQL的稳定存储,能够快速搭建权限管理、审核流、内容发布等业务模块。这样的技术组合在企业内部管理系统、内容管理平台等场景应用广泛。本文基于一套新闻稿件管理系统的完整实践,深入讲解后端JWT鉴权、动态SQL查询、前端路由守卫与代理配置,以及Ngi

weixin_33824385的博客 80

Qt —— 百度地图 - 3、Qt调用高德在线地图功能示例(附源码)

Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)

496

指纹浏览器指纹工厂(下):基于真实设备数据特征的马尔可夫链生成与校验

本文揭示了静态指纹生成算法在高级风控时序追踪下的致命缺陷,指出违背设备演进马尔可夫性质(如无状态跳跃、因果断裂)是导致指纹存活率骤降的核心原因。通过分析风控系统的时序状态机与多维特征验证机制,提出基于隐马尔可夫模型(HMM)的动态指纹架构:以真实设备的状态转移链为蓝本,构建异步演进的“数字基因熔炉”,通过非均匀时间步长、突发事件响应及微观因果绑定,模拟软硬件独立更新的物理法则。最终实现指纹在时间维度与微观特征上的自洽,规避风控的时序陷阱。

数据知道的博客 415

面试问题总结

文章目录1.abstract和interface异同2.构造方法3.final关键字作用4.重写和重载的区别4.1重载4.2重写5.this关键字6.封装的作用,实现封装的步骤7.封装中的getter和setter方法分别作用7.1setter方法7.2getter方法8.Mybatis-plus与Spring Data JPA9.装箱和拆箱9.1装箱9.2拆箱10.ArrayList底层原理11.反射12.Filter13.$与#的区别14.js中的DOM对象与jQuery中的DOM区别15.四大元注解1

肥猫不是猫 1109

RK3568 上C图像camera图像采集应用实例(二)

本文探索rk3568上实现C语言的 通过C v4l2 接口 采集图像 ,刷屏控制 drm的显示camera图像中 实现camera preview 预览 的实践和探索。

luoshanxuli2010的专栏 758

Java 防止XSS攻击(Spring boot & Spring 方式)

——SpringBoot application.properties 开启xss配置 # XSS配置 xss.enabled=true # 不过滤路径, 以逗号分割 xss.excludes=/open/* # 过滤路径, 逗号分割 xss.urlPatterns=/* 过滤器配置 package com.xlj.tools.config; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.Obj

bad_boy的博客 2122

5-EP4CE10F17C8-引脚配置

EP4CE10F17C8-引脚配置

weixin_44479192的博客 719

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

目前从事linux驱动开发,多交流多学习吧 1093

Springboot使用CrosXssFilter防止sql注入xss攻击cros跨域等

Springboot使用CrosXssFilter防止sql注入xss攻击cros跨域等1.编写CrosXssFilter.java,代码如下2.在springbooot的启动类中加入注解@ServletComponentScan 现在的web系统对安全性要求越来越高,常常需要通过第三方的渗透测试才能进行验收,其中就有关于sql注入、xss攻击相关的,此文记录如果在springbooot中进行非侵入的改造,达到能通过sql注入及xss攻击测试的目的。 1.编写CrosXssFilter.java,代码如下

冰之杍的博客 1421

学 Simulink——基于递推最小二乘法(RLS)的工业电机转动惯量 J在线辨识仿真

Te 估算 = 1.5·p·(ψ·iq + (Ld-Lq)·id·iq)回归量:φ(k)=−ω˙(k), y(k)=Te​(k), θ=J。仿真:电机加速 0→1500rpm,观测 J^(k)→Jnom​。(可选) Jtrue​切 0.04(双惯量负载)→ 看跟踪。电机机械运动方程:Te​−TL​=J⋅ω˙+B⋅ω。J^(0)=0.005→收敛至0.02kg⋅m2✔。Te​:电磁转矩(Nm),已知(来自电流环输出)仅需 Te​,ω(驱动器已有)→ 无额外传感 ✔。

amy_mhd的博客 44

Springboot增加一个xss过滤器,防止xss攻击

springboot增加xss过滤器,防止xss攻击

编程技术 3146

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot防御Xss攻击 Filter方式实现

导入依赖 <!-- xss --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.4</version> </dependency>

hk1909的博客 1484

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

XSS跨站脚本攻击

XSS跨站脚本攻击 什么是XXS? XSS全称跨站脚本(Cross Site Scripting),为了不和CSS混淆,故称为XSS. XSS攻击是一种注册型攻击,攻击者在可信的网页嵌入恶意代码,用户访问可信网站除法XSS而被攻击。 ...

qq_37017448的博客 338

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Springboot过滤xss

Springboot过滤xss 两种xss类型:存储型xss、反射型xss。 简介: 存储型:持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等 反射型:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。 问题产生: 公司代码发布前需要进行3部分安全扫描,其中第一个就出现这种

Time_Point的博客 3907

Spring Boot配置XSS

spring boot 配置xss

a123123sdf的博客 3303
上一篇: 一波反向操作, 我把几十个生产库给合了
下一篇: 45. 从零开始学springboot撸一个Xss过滤器-注解实现
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值