SpringBoot+Xss过滤(@RequestBody参数过滤Xss)

该博客介绍了如何在SpringBoot项目中使用XssFilter和XssHttpServletRequestWrapper来过滤XSS攻击。通过拦截请求,对@RequestBody注解的参数进行净化,避免SQL注入等恶意代码。依赖于Jsoup和Commons Lang3库,启动类需添加Servlet组件扫描。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次SpringBoot+Xss过滤

XssFilter过滤器
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import com.jfinal.kit.StrKit;

/**
 * @ProjectName: smt
 * @ClassName:
 * @Description:
 * @Author: yue zhenbin
 * @Date: 2021/7/7 9:16
 */
@Component
@WebFilter(urlPatterns = "/*", filterName = "xssFilter")
public class XssFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String contentType = request.getContentType();
        if (StrKit.notBlank(contentType) && contentType.contains("multipart/form-data")) {//对图片上传不进行xss过滤
            chain.doFilter(request, response);
        }else {
            XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
            chain.doFilter(xssRequest, response);
        }

    }
    @Override
    public void destroy() {}
}
XssHttpServletRequestWrapper过滤规则类

主要针对@RequestBody进行的参数过滤

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;


import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Document.OutputSettings;
import org.jsoup.safety.Whitelist;
import org.springframework.util.StreamUtils;

import com.alibaba.fastjson.JSONObject;

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

    //使用basic()
    private static final Whitelist whitelist = createWhitelist();

    private static final OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);

    private byte[] requestBody;
    private Charset charSet;

    private static Whitelist createWhitelist() {
        return Whitelist.basic();
    }

    private static String filter(String value) {
        if(value!=null) {
            value = Jsoup.clean(value, "", whitelist, outputSettings).trim();
        }
        return value;
    }

    /**
     *
     * @param request
     */
    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        //缓存请求body
        try {
            String requestBodyStr = getRequestPostStr(request);
            requestBodyStr=filterBadString(requestBodyStr);
            if (StringUtils.isNotBlank(requestBodyStr)) {
                requestBodyStr=filter(requestBodyStr);
                JSONObject resultJson = JSONObject.parseObject(requestBodyStr);
                requestBody = resultJson.toString().getBytes(charSet);
            } else {
                requestBody = new byte[0];
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取POST请求体中数据
     * @param request
     * @return
     * @throws IOException
     */
    public String getRequestPostStr(HttpServletRequest request)
            throws IOException {
        String charSetStr = request.getCharacterEncoding();
        if (charSetStr == null) {
            charSetStr = "UTF-8";
        }
        charSet = Charset.forName(charSetStr);

        return StreamUtils.copyToString(request.getInputStream(), charSet);
    }

    @Override
    public ServletInputStream getInputStream() {
        if (requestBody == null) {
            requestBody = new byte[0];
        }

        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody);

        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener) {
            }
            @Override
            public int read() {
                return byteArrayInputStream.read();
            }
        };
    }

    /**
     * 特殊字符过滤
     *
     * @param value
     * @return
     */
    private  static String filterBadString(String value) {

        String REP_TIPS = "BadParamter";

        value = value.replaceAll("select", REP_TIPS);

        value = value.replaceAll("SELECT", REP_TIPS);

        value = value.replaceAll("insert", REP_TIPS);

        value = value.replaceAll("INSERT", REP_TIPS);

        value = value.replaceAll("delete", REP_TIPS);

        value = value.replaceAll("DELETE", REP_TIPS);

        value = value.replaceAll("update", REP_TIPS);

        value = value.replaceAll("UPDATE", REP_TIPS);

        value = value.replaceAll("script", REP_TIPS);

        value = value.replaceAll(">", REP_TIPS);

        value = value.replaceAll("<", REP_TIPS);

        value = value.replaceAll("=", REP_TIPS);

        value = value.replaceAll("@", REP_TIPS);
        return value;
    }
}

启动类需添加Servlet扫描:@ServletComponentScan(“com.xxx.smt.config.XssFilter”)

所需要的依赖:
<dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- jfinal 核心包 -->
        <dependency>
            <groupId>com.jfinal</groupId>
            <artifactId>jfinal</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
	       <groupId>com.jfinal</groupId>
	       <artifactId>cos</artifactId>
	       <version>26Dec2008</version>
        </dependency>
### 如何在 Unity 中实现带滑块交互的圆形进度条 为了实现在 Unity 中创建带有滑块交互的环形进度条,可以利用 `Slider` 组件以及特定的填充方法来达成目标。对于 UI 的设计部分,Unity 提供了灵活的方式来定制化各种类型的视觉反馈。 #### 创建基础UI结构 首先,在 Unity 编辑器中的 Hierarchy 窗口中右键点击并选择 **UI -> Slider** 来添加一个新的滑动条对象到场景里。这会自动建立一个 Canvas 及其子物体 Slider[^2]。 #### 设置圆形象征性的 Image 组件 为了让进度条呈现为圆形外观,需找到刚创建出来的 Slider 下面名为 `Fill Area/Fill` 的 GameObject,并将其上的 Image 组件属性里的 Source Image 更改为适合做背景的一个圆形 Sprite 图片资源;接着把 Fill Method 设定成 Radial 360 度模式以形成完整的圈状显示效果[^3]。 #### 脚本控制逻辑编写 下面是一个简单的 C# 脚本来绑定滑块值的变化与环形进度条之间的同步更新: ```csharp using UnityEngine; using UnityEngine.UI; public class CircularProgressBar : MonoBehaviour { public Slider slider; // 关联至 Inspector 中对应的 Slider 控件 void Update() { float progressValue = slider.value / slider.maxValue; RectTransform rectTransform = GetComponent<RectTransform>(); rectTransform.Rotate(Vector3.forward, (progressValue * 360f - rectTransform.eulerAngles.z)); } } ``` 此脚本的作用在于每当用户拖拽滑块改变数值时,都会实时计算当前百分比并将之应用于旋转角度上从而达到动态展示的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dream答案

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

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

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

打赏作者

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

抵扣说明:

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

余额充值