Java实现XSS防御

XSS概述

跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

Servlet的方式

1、继承HttpServletRequestWrapper,实现对请求参数的过滤

/*** xss请求适配器*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}/*** 对数组参数进行特殊字符过滤*/@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if (values == null) {return null;}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = cleanXSS(values[i]);}return encodedValues;}/*** 对参数中特殊字符进行过滤*/@Overridepublic String getParameter(String name) {String value = super.getParameter(name);if (value == null) {return null;}return cleanXSS(value);}/*** 获取attribute,特殊字符过滤*/@Overridepublic Object getAttribute(String name) {Object value = super.getAttribute(name);if (value != null && value instanceof String) {cleanXSS((String) value);}return value;}/*** 对请求头部进行特殊字符过滤*/@Overridepublic String getHeader(String name) {String value = super.getHeader(name);if (value == null) {return null;}return cleanXSS(value);}/*** 转义字符,使用该方法存在一定的弊端* * @param value* @return*/private String cleanXSS2(String value) {// 移除特殊标签value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");value = value.replaceAll("\\(", "&#40;").replaceAll("\\)", "&#41;");value = value.replaceAll("'", "&#39;");value = value.replaceAll("eval\\((.*)\\)", "");value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");value = value.replaceAll("script", "");return value;}private String cleanXSS(String value) {if (value != null) {//推荐使用ESAPI库来避免脚本攻击,value = ESAPI.encoder().canonicalize(value);// 避免空字符串value = value.replaceAll(" ", "");// 避免script 标签Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 避免src形式的表达式scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 删除单个的 </script> 标签scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 删除单个的<script ...> 标签scriptPattern = Pattern.compile("<script(.*?)>",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 避免 eval(...) 形式表达式scriptPattern = Pattern.compile("eval\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 避免 e-xpression(...) 表达式scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 避免 javascript: 表达式scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 避免 vbscript:表达式scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 避免 οnlοad= 表达式scriptPattern = Pattern.compile("onload(.*?)=",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}return value;}}

2、实现Filter,实现XSS过滤器

/*** xss过滤器*/
public class XssFilter implements Filter {FilterConfig filterConfig = null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {//对请求进行拦截,防xss处理chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);}@Overridepublic void destroy() {this.filterConfig = null;}
}

3、注入XSS过滤器,两种方式
第一种方式:配置web.xml

<!-- xss过滤器 -->
<filter><filter-name>XssSqlFilter</filter-name><filter-class>cn.aric.xss.XssFilter</filter-class>
</filter>
<filter-mapping><filter-name>XssSqlFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher>
</filter-mapping>1234567891011

第二种方式:注解

/*** 注入Xss过滤器(注解方式)*/
public class WebInitializer implements WebApplicationInitializer{@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {//添加监听器servletContext.addListener(RequestContextListener.class);//添加过滤器Dynamic xssFilterRegistration = servletContext.addFilter("XssFilter", XssFilter.class);//添加映射规则xssFilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE), false, "/*");}}

Spring整合的方式

1、使用spring的HtmlUtils,可以使用StringEscapeUtils 中的过滤方法

/*** 解决XSS跨站脚本攻击和sql注入攻击,使用spring的HtmlUtils,可以使用StringEscapeUtils 中的过滤方法*/
public class XssSpringHttpServletRequestWrapper extends HttpServletRequestWrapper{public XssSpringHttpServletRequestWrapper(HttpServletRequest request) {super(request);}/*** 对数组参数进行特殊字符过滤*/@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);String[] newValues = new String[values.length];for (int i = 0; i < values.length; i++) {//spring的HtmlUtils进行转义newValues[i] = HtmlUtils.htmlEscape(values[i]);}return newValues;}/*** 拦截参数,并对其进行字符转义*/@Overridepublic String getParameter(String name) {return HtmlUtils.htmlEscape(name);}/*** 拦截参数,并对其进行字符转义*/@Overridepublic Object getAttribute(String name) {return HtmlUtils.htmlEscape(name);}}

2、实现XSS过滤器

/*** spring方式xss过滤器*/
public class XssSpringFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;chain.doFilter(new XssSpringHttpServletRequestWrapper(req), response);}@Overridepublic void destroy() {}

3、配置XSS过滤器

<!-- spring方式的xss过滤器 -->
<filter><filter-name>xssSpringFilter</filter-name><filter-class>cn.aric.xss.XssSpringHttpServletRequestWrapper</filter-class>
</filter>
<filter-mapping><filter-name>xssSpringFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>123456789

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

classmethod 继承_让人眼花缭乱的类继承

Python语言的一个优势是简洁易用。是否简洁易用仅仅是Python语言本身的一个话题&#xff0c;但“好消息”是如果你想创造那种一大堆继承、混乱的内部关系的代码&#xff0c;也是可以的&#xff01;今天烦人的代码来自于验证某些math-y数学分析代码。一开始&#xff0c;他们是发…

SQL优化之浅见

SQL优化之浅见一、查询优化二、导入大量数据时的优化三、INSERT优化四、字段注释五、说明用了段mysql/Oracle/hive等数据库,对SQL语言以Mysql为例&#xff0c;总结一下对sql优化方面的见解&#xff0c;欢迎大家补充。 一、查询优化 1.在关联查询中&#xff0c;关联键的数据类…

JAVA SSM框架+Redis 实现单点登录

1&#xff1a;什么是单点登录&#xff1f; 答&#xff1a;单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09; 一般我们的模块都是在同一个系统下&#xff0c;同一个tomcat&#xff08;如图&#xff0c;以商城为例&#xff09; 后来为了维护和…

2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...

9月25日&#xff0c;云栖大会在杭州阿里巴巴云栖小镇正式拉开序幕&#xff0c;三天会议期间&#xff0c;共吸引了200多位世界级科学家、400多家科技合作伙伴参与&#xff0c;科技展区面积超过3万平方米&#xff0c;共发布了1000多项顶尖技术。云栖大会现场在此次云栖大会上&…

从mysql到大数据(一)--开宗明义

一、大数据长什么样 长像很普通&#xff0c;至少看两眼后就觉得很平常。 举个栗子&#xff1a; 一个表格&#xff0c;学生信息表&#xff0c;里面有学号、姓名、性别、年龄、学校、学院、专业、年级、宿舍号等信息如下&#xff0c; 但是表在库里&#xff0c;我们想看&#xf…

SSO单点登录方案大全

分布式微服务系统主流常用的登录方案 前言: 单点登录其实是一个概念,主要是为了解决一次登录,多系统(本系统或外部系统)之间不需要重复登录的问题,就目前来说,主流的解决方案针对业务场景分为3个方向: 1: 同一公司,同父域下的单点登录解决方案. 如[http://map.baidu.com][[h…

em算法怎么对应原有分类_机器学习基础-EM算法

EM算法也称期望最大化(Expectation-Maximum,简称EM)算法&#xff0c;它是一个基础算法&#xff0c;是很多机器学习领域算法的基础&#xff0c;比如隐式马尔科夫算法(HMM)&#xff0c; LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。EM算法要解决的问题我们经常会…

从mysql到大数据(二)--数据库的认识

一、数据库的认识 数据库顾名思义&#xff0c;是存放数据的库房。 二、数据库的分类&#xff08;了解&#xff09; 可以分为两大类&#xff1a;关系型数据库和非关系型数据库。 关系型数据库&#xff1a; 关系型数据库&#xff0c;存储的格式可以直观地反映实体间的关系。…

postman插件下载、安装教程

这里只讲如何在Chrome 中安装postman插件 下载链接&#xff1a;https://pan.baidu.com/s/1vampHeD0UiDNbrB3G8j_hA 提取码&#xff1a;wqdl 方法/步骤 1.在Chrome输入地址&#xff1a;[chrome://extensions/] 2.将压缩包直接拖拽至Chrome中 3.运行在Chrome输入地址&#xff…

得力条码扫描器怎么用_广东智能物流控制系统怎么选

广东智能物流控制系统怎么选&#xff0c;东莞智库&#xff0c;东莞智库(SmartWarehouse)&#xff0c;专注电子制造SMT智能仓库&#xff0c;致力于帮助电子制造企业提高物流仓储效率和效能。广东智能物流控制系统怎么选&#xff0c; 旭日东自动分拣系统是个集机械、电气、计算机…

从mysql到大数据(三)--mysql数据库建模一常用数据类型及引擎

数据库的安装请自行百度。如果你想直捣黄龙练查询&#xff0c;没有表没有数据是不能实现的。我们从建表开始学习。但要知道&#xff0c;我们所有东西都是了解&#xff0c;学习不要有压力&#xff0c;不要必须要求记什么&#xff0c;当然&#xff0c;如果你不累可以记&#xff0…

Postman用法简介-Http请求模拟工具

Postman用法简介-Http请求模拟工具 在我们平时开发中&#xff0c;特别是需要与接口打交道时&#xff0c;无论是写接口还是用接口&#xff0c;拿到接口后肯定都得提前测试一下&#xff0c;这样的话就非常需要有一个比较给力的Http请求模拟工具&#xff0c;现在流行的这种工具也…

matlab多元函数_函数的计算机处理8(1)_1MATLAB

计算机语言运用--数值计算8-函数的计算机处理8(1)_1MATLAB计算机&#xff1a;电子线路组成的计算机器。人与计算机则是通过计算机语言-符号系统说给计算机听而交流。计算机语言有低级语言-机器语言、汇编、高级语言-C/C/C#/VB/PASCAL/LISP/JAVA/PYTHON/……成百上千种之多。 作…

(一)MySQL优化之索引优化

一、索引的概念 我们知道&#xff0c;在查询过程中&#xff0c;如果被查询的表没有索引&#xff0c;数据库会进行全表扫描&#xff0c;而如果添加了相应的索引&#xff0c;数据库会根据索引直接查找符合条件的数据。因此&#xff0c;索引的存在会大大提高查询效率。而索引其实…

Gson的fromJson()方法

Gson提供了fromJson()方法来实现从Json相关对象到Java实体的方法。 在日常应用中&#xff0c;我们一般都会碰到两种情况&#xff0c;转成单一实体对象和转换成对象列表或者其他结构。 先来看第一种&#xff1a; 比如json字符串为&#xff1a;[{“name”:”name0”,”age”:0…

java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究...

前言&#xff1a;前一段时间apace solr JMX因为配置不当出现远程代码执行漏洞&#xff0c;最近自己在看一套java系统时&#xff0c;发现该系统也存在JMX远程代码漏洞&#xff0c;于是乎就想研究下JMX这种通用型漏洞&#xff0c;下面我就从原理到利用对该漏洞做一个简单的梳理。…

Java注解的Retention和RetentionPolicy

一 源码赏析 1 源码 Documented Retention(RetentionPolicy.RUNTIME) Target(ElementType.ANNOTATION_TYPE) public interface Retention {RetentionPolicy value(); }public enum RetentionPolicy {//此注解类型的信息只会记录在源文件中&#xff0c;编译时将被编译器丢弃&a…

hive UDF函数取最新分区

hive UDF函数取最新分区 1.pom文件 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1…

app每秒并发数_性能测试连载 (38) jmeter 线程数与性能测试的负载模式

点击跳转>>jmeter--由浅入深学性能系列需求下面有3个场景&#xff0c;思考一下在jmeter里面如何设计场景1&#xff1a;有一个项目&#xff0c;500用户同时登录&#xff0c;响应时间能达到多少场景2&#xff1a;考勤打卡&#xff0c;最大吞吐量能达到多少(每秒最大能完成多…

用自定义注解做点什么——自定义注解有什么用

用自定义注解做点什么 前言 你不一定听过注解&#xff0c;但你一定对Override不陌生。 当我们重写父类方法的时候我们就看到了Override。我们知道它表示父类方法被子类重写了。 现在告诉你&#xff0c;Override就是一个注解。 也许你会疑惑注解是什么&#xff1f; 注解&…