Hello大家好,本章我们添加防止XSS攻击功能 。有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢

一:什么是XSS

XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

你可以自己做个简单尝试:
1. 在任何一个表单内,你输入一段简单的js代码:<script>for(var i=0;i<1000;i++){alert("弹死你"+i);}</script>,将其存入数据库;
2. 在页面上一个div元素内直接展示第一步内存入的值,你会发现弹出框出现了;

以上两个示例仅仅算是恶作剧,恶意用户能做的更多,如获取用户信息,进行“网络钓鱼”攻击等。

应对XSS攻击的其中一个方式就是后端对输入内容进行过滤,输入内容里面的敏感信息直接过滤,如<script>标签等。

二:添加Jsoup依赖

Jsoup使用标签白名单的机制用来进行防止XSS攻击, 假设白名单中只允许p标签存在, 此时在一段HTML代码中, 只能存在p标签 , 其他标签将会被清除只保留被标签所包裹的内容,当然,Jsoup不仅仅可以用来过滤,还可以用来爬虫,这里先不做说明,后期会单写一篇文章进行讲解。

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version>
</dependency>复制代码

三:创建过滤器

在core下创建filter文件夹

1、创建过滤规则

package com.example.demo.core.filter;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;/*** @author 张瑶* @Description: xss非法标签过滤* @date 2018/5/16 20:03*/
public class XssFilterUtil {/*** 使用自带的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);}
}
复制代码

2、重写请求参数处理函数,这是实现XSS过滤的关键,在其内重写了getParameter,getParameterValues,getHeader等方法,对http请求内的参数进行了过滤。

package com.example.demo.core.filter;import org.apache.commons.lang3.StringUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/*** 重写请求参数处理函数*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {HttpServletRequest orgRequest = null;private boolean isIncludeRichText = false;public XssHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) {super(request);orgRequest = request;this.isIncludeRichText = isIncludeRichText;}/*** 覆盖getParameter方法,将参数名和参数值都做xss过滤.* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖*/@Overridepublic String getParameter(String name) {if (("content".equals(name) || name.endsWith("WithHtml")) && !isIncludeRichText) {return super.getParameter(name);}name = XssFilterUtil.clean(name);String value = super.getParameter(name);if (StringUtils.isNotBlank(value)) {value = XssFilterUtil.clean(value);}return value;}@Overridepublic String[] getParameterValues(String name) {String[] arr = super.getParameterValues(name);if (arr != null) {for (int i = 0; i < arr.length; i++) {arr[i] = XssFilterUtil.clean(arr[i]);}}return arr;}/*** 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>* getHeaderNames 也可能需要覆盖*/@Overridepublic String getHeader(String name) {name = XssFilterUtil.clean(name);String value = super.getHeader(name);if (StringUtils.isNotBlank(value)) {value = XssFilterUtil.clean(value);}return value;}/*** 获取最原始的request** @return*/public HttpServletRequest getOrgRequest() {return orgRequest;}/*** 获取最原始的request的静态方法** @return*/public static HttpServletRequest getOrgRequest(HttpServletRequest req) {if (req instanceof XssHttpServletRequestWrapper) {return ((XssHttpServletRequestWrapper) req).getOrgRequest();}return req;}}复制代码

3、添加过滤XSS请求的入口,在这里通过XssHttpServletRequestWrapper将HttpServletRequest进行了封装,filterChain.doFilter(xssRequest, response);保证了后续代码执行request.getParameter,request.getParameterValues,request.getHeader时调用的都是XssHttpServletRequestWrapper内重写的方法,获取到的参数是已经进行过标签过滤的内容,从而消除了敏感信息。

package com.example.demo.core.filter;import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author 张瑶* @Description: 拦截防止xss注入 通过Jsoup过滤请求参数内的特定字符* @date 2018/5/16 20:04*/
public class XssFilter implements Filter {//是否过滤富文本内容private static boolean IS_INCLUDE_RICH_TEXT = true;public List<String> excludes = new ArrayList<>();@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;if (handleExcludeURL(req, resp)) {filterChain.doFilter(request, response);return;}XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request, IS_INCLUDE_RICH_TEXT);filterChain.doFilter(xssRequest, response);}private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {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;}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {String isIncludeRichText = filterConfig.getInitParameter("isIncludeRichText");if (StringUtils.isNotBlank(isIncludeRichText)) {IS_INCLUDE_RICH_TEXT = BooleanUtils.toBoolean(isIncludeRichText);}String temp = filterConfig.getInitParameter("excludes");if (temp != null) {String[] url = temp.split(",");for (int i = 0; url != null && i < url.length; i++) {excludes.add(url[i]);}}}@Overridepublic void destroy() {}}
复制代码

四:注册过滤器

创建core→configurer→XssFilterConfigurer

package com.example.demo.core.configurer;import com.example.demo.core.filter.XssFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;/*** @author 张瑶* @Description:xss过滤拦截器配置文件* @time 2018/5/16 20:47*/
@Configuration
public class XssFilterConfigurer {/*** xss过滤拦截器*/@Beanpublic FilterRegistrationBean xssFilterRegistrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new XssFilter());filterRegistrationBean.setOrder(Integer.MAX_VALUE-1);filterRegistrationBean.setEnabled(true);filterRegistrationBean.addUrlPatterns("/*");Map<String, String> initParameters = new HashMap();//excludes用于配置不需要参数过滤的请求urlinitParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*");//isIncludeRichText主要用于设置富文本内容是否需要过滤initParameters.put("isIncludeRichText", "true");filterRegistrationBean.setInitParameters(initParameters);return filterRegistrationBean;}
}复制代码

五:测试

路径localhost:8080/userInfo/selectById

请求参数id=1<a href="http://www.baidu.com/a" onclick="alert("模拟XSS攻击");">sss</a><script>alert(0);</script>sss

结果:

我们可以看到<script></script>已经被过滤掉

项目地址

码云地址: gitee.com/beany/mySpr…

GitHub地址: github.com/MyBeany/myS…

写文章不易,如对您有帮助,请帮忙点下star

结尾

添加防止XSS攻击功能已完成,后续功能接下来陆续更新,有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢大家。

从零搭建自己的SpringBoot后台框架(十三)相关推荐

  1. 从零搭建自己的SpringBoot后台框架(一)

    Hello大家好,本章我们搭建项目基础框架结构和整合mybatis:项目所需环境jdk1.8,maven,mysql数据库:开发工具IDEA.有问题可以联系我.另求各路大神指点,感谢! 一:通过ide ...

  2. 从零搭建自己的SpringBoot后台框架(六)

    Hello大家好,本章我们添加Swagger2来在线自动生成接口的文档+测试功能.有问题可以联系我mr_beany@163.com.另求各路大神指点,感谢 一:什么是Swagger Swagger是一 ...

  3. 从零搭建自己的SpringBoot后台框架(七)

    Hello大家好,本章我们添加PageHelper分页查询功能.有问题可以联系我mr_beany@163.com.另求各路大神指点,感谢 一:什么是PageHelper PageHelper是一款好用 ...

  4. 搭建一个简单springboot后端框架

    前言 框架知识是每个程序员都应该或多或少都要有所了解,作为后端开发更是以后进阶架构师必备的知识储备:以此为出发点,我们可以从搭建一个简单的后端框架开始,了解相关的技术点和搭建思路. 我们可以从创建项目 ...

  5. 详解从零搭建企业级 vue3 + vite2+ ts4 框架全过程

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 本文不仅仅是搭建个脚手架这么简单,还会带你了解每一步.甚至每一个配置项的作用,和每个配置的知 ...

  6. activiti 工作流 springboot 后台框架平台 集成代码生成器 shiro 权限

    QQ 313596790 官网:www.fhadmin.org 下载地址 工作流模块---------------------------------------------------------- ...

  7. 【源码好又多】springboot后台框架

    " 关键句: java " 导读:市面上权限框架大多都是采用SpringBoot.MyBatis.Shiro的居多,这里来一个SpringBoot.JPA.Shiro的.JDK1. ...

  8. SpringBoot后台权限管理系统(三)—权限模块

    SpringBoot 后台权限框架搭建(一)-后台框架搭建 SpringBoot后台权限管理系统(二)-前端工程搭建 SpringBoot后台权限管理系统(三)-权限模块 SpringBoot后台权限 ...

  9. 基于springboot 快速搭建简单前后端分离项目-后台框架

    目录 1.新建project 2.选择依赖 3.简单配置 4.数据库准备 5.完成后台逻辑代码 5.1创建java实体对象 5.2创建repository 5.3单元测试 5.4编写controlle ...

  10. Springboot + mybatis搭建后台框架

    最近在学习Java搭建后台框架,想自己写接口,自己用,毕竟自己动手丰衣足食,同时也想去了解一下后台的大体框架和流程是怎么创建的,此过程由公司后台教的,有人带着真好~ 首先第一步,就是创建数据库,这个是 ...

最新文章

  1. EmEditor Professional(文本编辑) 下载地址
  2. java鼠标样式设置,设置Echarts鼠标悬浮样式
  3. Matlab生成m序列
  4. 关于django内置的ModelForm小记
  5. 感恩节专宠有礼,送3本技术好书
  6. AngularJs学习笔记0——前言
  7. (翻译)Entity Framework技巧系列之一 - Tip 1 - 5
  8. html英文特殊字体代码,字体_中英文字体等(示例代码)
  9. 屏幕录像大师如何把LXE文件转换为EXE文件
  10. layui 勾选不联动父项 树形控件,treetable-lay
  11. Spark机器学习(一)—Spark相关
  12. 大前端课程学习心得体会+学习笔记
  13. android studio 免费实现聊天视频功能
  14. 培养良好习惯的7个正确方法
  15. 苹果开发者新账号上新app审核被拒绝:Other-Other被拒绝,心路历程记录!
  16. C语言遍历文件目录:readdir,opendir
  17. 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny
  18. 完成清除工作,可以Destory窗口标志
  19. Medium之1421.净现值查询
  20. 7-1 列出连通集(25 分)

热门文章

  1. Easyui datebox单击文本框显示日期选择
  2. Ajax控件之ScriptManager与UpdatePanel用法 by:凉游浅笔深画眉 / Net7Cracker
  3. java调优随记-java对象大小
  4. oracle 主键自增
  5. CLR via C# 3rd - 07 - Constants and Fields
  6. .NET在后置代码中输入JS提示语句(背景不会变白)
  7. 【OpenCV入门指南】第十一篇 鼠标绘图
  8. VS2010/MFC编程入门之前言
  9. photoshop 2021在m1 mac上导出png发生未知错误的解决方案
  10. macOS 12 Monterey实用功能