So eazy!SpringBoot 一键去除参数前后空格和 XSS 过滤实战解析
去除 XSS 字符串需要借助工具类 jsoup ,这里 jsoup 有一点需要注意的是,jsoup 的功能可能有点太强大了,能把 xss 攻击的内容直接过滤掉了不说,也会对英文尖括号 <> 转义,到接口里面拿到的参数就变成了 <> ,存库里面的就是转义后的字符串了。取出来的时候需要转一下。
比如前台传的参数传的是: 12<>3<script>alter('11111111')</script>455
过滤处理了后,到后台接口里面就成了: [12<>3455]
如果上面的结果能接受,那么这个工具类就可以用。
引入依赖 jsoup
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency>复制代码 JsoupUtil.java 工具类:
import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.safety.Whitelist;
/***
@Auther linmengmeng
@Date 2021-08-19 15:47
描述: 过滤 HTML 标签中 XSS 代码/public class JsoupUtil {/*
使用自带的 basicWithImages 白名单
允许的便签有 a,b,blockquote,br,cite,code,dd,dl,dt,em,i,li,ol,p,pre,q,small,span,strike,strong,sub,sup,u,ul,img
以及 a 标签的 href,img 标签的 src,align,alt,height,width,title 属性/private static final Whitelist whitelist = Whitelist.basicWithImages();/* 配置过滤化参数, 不对代码进行格式化 */private static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);static {// 富文本编辑时一些样式是使用 style 来进行实现的// 比如红色字体 style="color:red;"// 所以需要给所有标签添加 style 属性 whitelist.addAttributes(":all", "style");}public static String clean(String content) {return Jsoup.clean(content, "", whitelist, outputSettings);}}复制代码首先是定义参数过滤器: ParamsFilter 实现 Filter 类
import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;
/**
Description : 参数过滤器
*/public class ParamsFilter implements Filter {
}复制代码添加参数过滤配置文件:
import gc.cnnvd.framework.core.filter.ParamsFilter;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
import javax.servlet.DispatcherType;
@Configurationpublic class ParameterTrimConfig {
}复制代码处理都交给了这货:
import com.alibaba.fastjson.JSON;import gc.cnnvd.framework.config.converter.JsonValueTrimUtil;import gc.cnnvd.framework.util.JsoupUtil;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;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;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;
/***
@Auther linmengmeng
@Date 2021-03-25 15:47
Description : 请求参数的处理,
去除参数前后空格
过滤 XSS 非法字符
*/public class ParameterRequestWrapper extends HttpServletRequestWrapper {
}复制代码上面 form 传的参数直接处理了,那么要是 JSON 传的参数,就要借助下面的工具类了:
import cn.hutool.json.JSONTokener;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import gc.cnnvd.framework.util.JsoupUtil;import org.apache.commons.lang3.StringUtils;
import java.util.Map;import java.util.Set;
/**
@Auther linmengmeng
@Date 2021-03-25 15:47
去除 Json 字符串中的属性值前后空格的工具类
去除 XSS 攻击字符*/
public class JsonValueTrimUtil {
}复制代码测试一下:
import gc.cnnvd.framework.common.api.ApiResult;import gc.cnnvd.framework.log.annotation.OperationLogIgnore;import io.swagger.annotations.Api;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import io.swagger.annotations.ApiOperation;import lombok.Data;import lombok.experimental.Accessors;import lombok.extern.slf4j.Slf4j;import org.springframework.validation.annotation.Validated;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.constraints.NotBlank;import java.io.Serializable;
/**
@Auther linmengmeng
@Date 2021-03-30 16:24*/@Slf4j@RestController@RequestMapping("/tourist")@Api(value = "测试游客页面 xss", tags = {"游客页面 xss"})public class TouristTestXssController {
@PostMapping("/testXssForm")@OperationLogIgnore@ApiOperation(value = "测试放开游客页面接口 xssForm", notes = "测试放开游客页面接口 xssForm", response = String.class)public ApiResult<String> testXss(TestXssFormParam testXssFormParam) {log.info("form param testStr:[{}]", testXssFormParam.getTestStr());// from 不好使 return ApiResult.ok(testXssFormParam.getTestStr());}
@PostMapping("/testXssJson")@OperationLogIgnore@ApiOperation(value = "测试放开游客页面接口 xssJson", notes = "测试放开游客页面接口 xssJson", response = String.class)public ApiResult<String> testXssJson(@Validated @RequestBody TestXssFormParam testXssFormParam) {log.info("json param testStr:[{}]", testXssFormParam.getTestStr());return ApiResult.ok(testXssFormParam.getTestStr());}
@Data@Accessors(chain = true)@ApiModel(value = "testXss 参数")public static class TestXssFormParam implements Serializable {
}
}复制代码上面接口里面的 ApiResult 为自定义封装的返回数据格式,可以直接修改接口返回类型改为 String,就是为了看下后台处理后,返回前台是什么样的。
form 传参,过滤成功。
So eazy!SpringBoot 一键去除参数前后空格和 XSS 过滤实战解析 JSON 传参,也没毛病。
So eazy!SpringBoot 一键去除参数前后空格和 XSS 过滤实战解析
评论