返回顶部
首页 > 资讯 > 精选 >springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写
  • 764
分享到

springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写

2023-06-22 03:06:17 764人浏览 独家记忆
摘要

SpringBoot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。springboot使用过滤器,jsoup过滤XSS脚本背景

SpringBoot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

    springboot使用过滤器,jsoup过滤XSS脚本

    背景:略

    目标:完成request请求中的脚本过滤

    技术:filter,jsoup,requestWapper

    1.把可能包含脚本的参数位置分析一下

    • post/put/delete: 请求的参数中,有可能是表单提交、也有可能是使用了@requestBody注解,那么参数就是JSON格式,位于request的流中。

    • get/options等:可能存在于url参数中,也有可能是表单提交的预请求中,所以一般在能想到的位置都有可能存在,包括header中。

    2.分析实现过程

    1首先要从request请求中将各个需要过滤位置的参数取出来

    2然后将参数取出来进行过滤

    3将过滤后的参数重新包装成request传递下去

    4在这期间,

    • 需要准备好jsoup过滤脚本的工具类;

    • 需要自定义一个过滤器,并且在过滤器中添加匹配条件,如:那些url不需要过滤,那些请求方式必须进行过滤;

    • 对过滤器进行配置,是否开启,设置在整个过滤器链中的位置,设置过滤的白名单或者黑名单

    • 所以就很清晰了我们过滤需要哪些类,哪些配置了

    一个filter

    一个requestWapper

    一个jsoup工具类

    一个filter的配置类

    5进行数据测试

    3.代码实现过程

    1.jsoup依赖:

    <!--screen xss --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency>

    2jsoup工具类:JsoupUtil

    import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.safety.Whitelist;   import java.io.FileNotFoundException; import java.io.IOException;    public class JsoupUtil {   private static final Whitelist whitelist = Whitelist.simpleText();//jsoup白名单种类,有四种,每一种针对的标签类型不一样,具体的可以ctrl+左键点击simpleText,在jsoup源码中有响应的注释和标签名单//add myself white list labelprivate static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);static {whitelist.addAttributes(":all", "style").addTags("p").addTags("strong");//将自定义标签添加进白名单,除开白名单之外的标签都会被过滤whitelist.preserveRelativeLinks(true);//这个配置的意思的过滤如果找不到成对的标签,就只过滤单个标签,而不用把后面所有的文本都进行过滤。//(之前在这个问题上折腾了很久,当<script>标签只有一个时,会<script>标签后面的数据全部过滤)} public static String clean(String content) { //过滤方法return Jsoup.clean(content, "", whitelist, outputSettings);} //test mainpublic static void main(String[] args) throws FileNotFoundException, IOException {String text = "<a href=\"Http://www.baidu.com/a\" onclick=\"alert(1);\"><strong><p>sss</p></strong></a><script>alert(0);</script>sss";System.out.println(clean(text));}}

    3request包装类XsshttpservletRequestWrapper

    import java.io.*;import java.util.*;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import com.xxx.utils.JsoupUtil;import org.jsoup.nodes.Document;import org.springframework.util.StringUtils; public class XsshttpServletRequestWrapper extends HttpServletRequestWrapper { //因为我们需要获取request中的数据,所以需要继承java底层中HttpServletRequestWrapper这个类,重写父类中的某些方法,获取相应位置的参数    private HttpServletRequest orgRequest = null;    private static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);    public XssHttpServletRequestWrapper(HttpServletRequest request) {        super(request);        orgRequest = request;    }     @Override     public ServletInputStream getInputStream() throws IOException {//get          BufferedReader br = new BufferedReader(new InputStreamReader(orgRequest.getInputStream()));        String line = br.readLine();        String result = "";        if (line != null) {            result += clean(line);        }         return new WrappedServletInputStream(new ByteArrayInputStream(result.getBytes()));    }    @Override    public String getParameter(String name) {        if (("content".equals(name) || name.endsWith("Withhtml"))) {            return super.getParameter(name);        }        name = clean(name);        String value = super.getParameter(name);        if (!StringUtils.isEmpty(value)) {            value = clean(value);        }        return value;    }     @Override    public Map getParameterMap() {        Map map = super.getParameterMap();        // 返回值Map        Map<String, String> returnMap = new HashMap<String, String>();        Iterator entries = map.entrySet().iterator();        Map.Entry entry;        String name = "";        String value = "";        while (entries.hasNext()) {            entry = (Map.Entry) entries.next();            name = (String) entry.geTKEy();            Object valueObj = entry.getValue();            if (null == valueObj) {                value = "";            } else if (valueObj instanceof String[]) {                String[] values = (String[]) valueObj;                for (int i = 0; i < values.length; i++) {                    value = values[i] + ",";                }                value = value.substring(0, value.length() - 1);            } else {                value = valueObj.toString();            }            returnMap.put(name, clean(value).trim());        }        return returnMap;    }     @Override    public String[] getParameterValues(String name) {        String[] arr = super.getParameterValues(name);        if (arr != null) {            for (int i = 0; i < arr.length; i++) {                arr[i] = clean(arr[i]);            }        }        return arr;    }         public HttpServletRequest getOrgRequest() {        return orgRequest;    }         public static HttpServletRequest getOrgRequest(HttpServletRequest req) {        if (req instanceof XssHttpServletRequestWrapper) {            return ((XssHttpServletRequestWrapper) req).getOrgRequest();        }        return req;    }     public String clean(String content) {        String result = JsoupUtil.clean(content);        return result;    }     private class WrappedServletInputStream extends ServletInputStream {        public void setStream(InputStream stream) {            this.stream = stream;        }         private InputStream stream;         public WrappedServletInputStream(InputStream stream) {            this.stream = stream;        }         @Override        public int read() throws IOException {            return stream.read();        }         @Override        public boolean isFinished() {            return true;        }         @Override        public boolean isReady() {            return true;        }         @Override        public void setReadListener(ReadListener readListener) {         }    }}

    4filter-XssFilter

    import org.apache.commons.lang.BooleanUtils;import org.apache.commons.lang.StringUtils; import java.io.IOException; import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern; import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; //@WEBFilter//@Component   在这里可以不用这个注解,以为后面我们会在config中去配置这个filter,在这里只需要实现 Filter  接口实现相应的方法就okpublic class XssFilter implements Filter {    private static boolean IS_INCLUDE_RICH_TEXT = false;//用于接收配置中的参数,决定这个过滤器是否开启    public List<String> excludes = new ArrayList<String>();//用于接收配置中的参数,决定哪些是不需要过滤的url(在这里,也可以修改handleExcludeURL()方法中相应的代码,使其变更为只需要过滤的url)    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse resp = (HttpServletResponse) response;        if (handleExcludeURL(req, resp)) {            chain.doFilter(request, response);            return;        }        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);        chain.doFilter(xssRequest, response);    }    private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {        if ((excludes == null || excludes.isEmpty())&&IS_INCLUDE_RICH_TEXT) {            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;    }    @Override    public void init(FilterConfig arg0) throws ServletException {        String isIncludeRichText = arg0.getInitParameter("isIncludeRichText");        if (StringUtils.isNotBlank(isIncludeRichText)) {            IS_INCLUDE_RICH_TEXT = BooleanUtils.toBoolean(isIncludeRichText);        }         String temp = arg0.getInitParameter("excludes");        if (temp != null) {            String[] url = temp.split(",");            for (int i = 0; url != null && i < url.length; i++) {                excludes.add(url[i]);            }        }    }     @Override    public void destroy() {    }}

    5filter的配置类:XssConfig

    import com.xxx.filter.XssFilter;import com.Google.common.collect.Maps;import org.springframework.boot.web.servlet.FilterReGIStrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; import java.util.Map; @Configurationpublic class XssConfig {    @Bean    public FilterRegistrationBean xssFilterRegistrationBean() {        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();        filterRegistrationBean.setFilter(new XssFilter());        filterRegistrationBean.setOrder(1);//filter order ,set it first        filterRegistrationBean.setEnabled(true);        filterRegistrationBean.addUrlPatterns("/*"); //set filter all url mapping        Map<String, String> initParameters = Maps.newHashMap();        initParameters.put("excludes", "/oauth/token");///white list url        initParameters.put("isIncludeRichText", "true");//enable or disable        filterRegistrationBean.setInitParameters(initParameters);        return filterRegistrationBean;    }}

    调试截图:

    请求:

    springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写

    程序截图:

    springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写

    运行结果:

    springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写

    可以看到body中 的脚本已经被过滤了,

    然后其他的截图我就不发了,还有一种思路就是在过滤器中把字符转义。

    感谢luckpet大佬的提示

    1 BufferedReader 使用完需要关闭 ;

    2 对于一些拿postman等工具的朋友,拼接json的话会有换行 这里result += clean(line); 需要改成: while((line = br.readLine()) != null){ if (line != null) { result += line; } }

    使用jsoup防止XSS攻击

    前阵子项目国测后,打开一个项目页面,莫名其妙弹出xss,搜了全局也没找到alert("xss"),问了一下项目经理,原来是国测做防注入的时候,在添加数据的时候做的,一脸懵逼。

    查了一下资料,以前做项目的时候都没想到这个问题,如果保存一段script脚本,查数据的时候,这段脚本就会被执行,这东西后果挺严重啊,如果是在桌面外弹框,执行个挖矿脚本,这玩意不得了啊,厉害,长知识了。。。

    <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version></dependency>

    看完上述内容,你们掌握springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写

    本文链接: https://lsjlt.com/news/302169.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写
      springboot中怎么使用过滤器以及jsoup过滤XSS脚本怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。springboot使用过滤器,jsoup过滤XSS脚本背景...
      99+
      2023-06-22
    • springboot中使用过滤器,jsoup过滤XSS脚本详解
      目录springboot使用过滤器,jsoup过滤XSS脚本1.把可能包含脚本的参数位置分析一下2.分析实现过程3.代码实现过程使用jsoup防止XSS攻击springboot使用过...
      99+
      2024-04-02
    • Vue中过滤器怎么使用
      这篇文章主要讲解了“Vue中过滤器怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中过滤器怎么使用”吧!过滤器其本质其实就是函数,作用在于用户输入数据用户,能够进行处理,并且返回...
      99+
      2023-06-03
    • AngularJS怎么使用过滤器
      这篇文章给大家分享的是有关AngularJS怎么使用过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么使用过滤器? 在实际操作中,我们需要对统一数据源进行多次转换,比...
      99+
      2024-04-02
    • Shell过滤器怎么使用
      这篇文章主要介绍“Shell过滤器怎么使用”,在日常操作中,相信很多人在Shell过滤器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Shell过滤器怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-09
    • vue.js中过滤器怎么用
      这篇文章给大家分享的是有关vue.js中过滤器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言大家再使用vue做项目时,查询功能当然必不可少,这就得使用vue强大的fil...
      99+
      2024-04-02
    • Vue中过滤器怎么用
      这篇文章主要为大家展示了“Vue中过滤器怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue中过滤器怎么用”这篇文章吧。前言最近在项目的开发中,出现一些格...
      99+
      2024-04-02
    • es6中filter过滤器怎么使用
      这篇“es6中filter过滤器怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6中filter过滤器怎么使用”文...
      99+
      2023-07-05
    • vue指令及其过滤器怎么使用
      本篇内容主要讲解“vue指令及其过滤器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue指令及其过滤器怎么使用”吧!vue 指令与过滤器内容渲染指令内容渲染指令是用来辅助开发者渲染 D...
      99+
      2023-07-05
    • Vue过滤器怎么自定义及使用
      这篇文章主要介绍“Vue过滤器怎么自定义及使用”,在日常操作中,相信很多人在Vue过滤器怎么自定义及使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue过滤器怎么自定义及使用”的疑惑有所帮助!接下来,请跟...
      99+
      2023-07-04
    • JavaWeb过滤器Filter怎么使用
      这篇文章主要介绍“JavaWeb过滤器Filter怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaWeb过滤器Filter怎么使用”文章能帮助大家解决...
      99+
      2024-04-02
    • java filter过滤器怎么使用
      在 Java 中使用过滤器(Filter)需要以下步骤:1. 创建一个类并实现 javax.servlet.Filter 接口。该接...
      99+
      2023-09-06
      java filter
    • Vue.js的过滤器怎么使用
      这篇文章主要介绍了Vue.js的过滤器怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue.js的过滤器怎么使用文章都会有所收获,下面我们一起来看看吧。一、过滤器作用过滤器用于进行文本内容格式化处理。二...
      99+
      2023-06-29
    • PHP过滤器怎么用
      本篇内容主要讲解“PHP过滤器怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP过滤器怎么用”吧!PHP 过滤器PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。。。。。...
      99+
      2023-06-04
    • vue过滤器在v2.0版本中怎么用
      这篇文章主要为大家展示了“vue过滤器在v2.0版本中怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue过滤器在v2.0版本中怎么用”这篇文章吧。1.x...
      99+
      2024-04-02
    • AngularJS中的过滤器filter怎么使用
      这篇文章主要介绍“AngularJS中的过滤器filter怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“AngularJS中的过滤器filter怎么使用”文章能帮助大家解决问题。在Angul...
      99+
      2023-07-04
    • vue中过滤器filter怎么用
      这篇文章主要为大家展示了“vue中过滤器filter怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中过滤器filter怎么用”这篇文章吧。示例<...
      99+
      2024-04-02
    • Java布隆过滤器怎么使用
      本文小编为大家详细介绍“Java布隆过滤器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java布隆过滤器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通常你判断某个元素是否存在用的是什么?很多...
      99+
      2023-06-29
    • Vue的filters过滤器怎么使用
      本篇内容主要讲解“Vue的filters过滤器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的filters过滤器怎么使用”吧!1、示例代码采用vue单文件组件,使用moment插...
      99+
      2023-07-04
    • VUE2.X过滤器怎么用
      这篇文章将为大家详细讲解有关VUE2.X过滤器怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VUE2.X过滤器的使用方法有几种,今天讲一种,以cnode社区API为...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作