Java Web应用程序的反跨站点脚本(XSS)过滤器

这是为Java Web应用程序编写的一个好简单的反跨站点脚本(XSS)过滤器。 它的主要作用是从请求参数中删除所有可疑字符串,然后将其返回给应用程序。 这是我以前关于该主题的帖子的改进。
您应该将其配置为链(web.xml)中的第一个过滤器,通常最好让它捕获对您站点的所有请求。
实际的实现包括两个类,实际的过滤器非常简单,它将HTTP请求对象包装在一个专门的HttpServletRequestWrapper中,它将执行我们的过滤。
public class XSSFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);}}

包装程序将覆盖getParameterValues(),getParameter()和getHeader()方法,以在将所需字段返回给调用方之前执行过滤。 实际的XSS检查和剥离是在stripXSS()私有方法中执行的。

import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class XSSRequestWrapper extends HttpServletRequestWrapper {public XSSRequestWrapper(HttpServletRequest servletRequest) {super(servletRequest);}@Overridepublic String[] getParameterValues(String parameter) {String[] values = super.getParameterValues(parameter);if (values == null) {return null;}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = stripXSS(values[i]);}return encodedValues;}@Overridepublic String getParameter(String parameter) {String value = super.getParameter(parameter);return stripXSS(value);}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);return stripXSS(value);}private String stripXSS(String value) {if (value != null) {// NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to// avoid encoded attacks.// value = ESAPI.encoder().canonicalize(value);// Avoid null charactersvalue = value.replaceAll("", "");// Avoid anything between script tagsPattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid anything in a src='...' type of expressionscriptPattern = 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("");// Remove any lonesome </script> tagscriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome <script ...> tagscriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid eval(...) expressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid expression(...) expressionsscriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid javascript:... expressionsscriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... expressionsscriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid onload= expressionsscriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}return value;}
}

请注意有关ESAPI库的注释,我强烈建议您将其检出并尝试将其包含在项目中。

如果您想深入了解该主题,建议您查看有关XSS和RSnake的XSS(跨站点脚本)备忘单的 OWASP页面 。

参考: Ricardo Zuasti博客博客中的JCG合作伙伴 Ricardo Zuasti提供了针对Java Web应用程序的更强大的反跨站点脚本(XSS)过滤器 。


翻译自: https://www.javacodegeeks.com/2012/07/anti-cross-site-scripting-xss-filter.html

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

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

相关文章

生成建表脚本up_CreateTable

已经很久没用使用这个脚本了&#xff0c;今天用到&#xff0c;并做修改&#xff0c;增加了生成扩展属性功能。 Go if object_ID([up_CreateTable]) is not nullDrop Procedure [up_CreateTable] Go /* 生成建表脚本(V4.0) Andy 2017-3-28 */ Create Proc up_CreateTable (obje…

android程序员周记,程序员实习周记100篇

程序员实习周记100篇有效防止雷同&#xff01;简单修改即可使用&#xff01;姓名&#xff1a;XXX学号&#xff1a;20190920008专业&#xff1a;M]指导老师&#xff1a;实习时间&#xff1a;20XX-XX-XX—20XX-XX-XX2019年XX月XX日t8in6Ay8Cw7c HuktN6ttTE12V7A eZu9g e7W1Y Dxqx…

Python之装饰器

装饰器功能有两点&#xff1a;1.首先自动执行装饰器后面跟的这个函数&#xff0c;并将装饰器修饰的那个函数名作为参数带入装饰器后面函数&#xff1b;2.将装饰器后面函数的返回值&#xff0c;赋值给装饰器所修饰的那个函数。举个例子说明&#xff1a; 1 def outer(func):2 …

在独立Java应用程序中使用Tomcat JDBC连接池

这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按。 您可能会在文章结尾找到本书的折扣券代码&#xff0c;仅适用于Java Code Geeks的读者&#xff01; 请享用&#xff01; 在需要数据访问权限的独立Java应用程序中使用JDBC连接池时&#xff0c;大多数开发人员将使用com…

Python之路【目录】 2

http://www.cnblogs.com/wupeiqi/articles/4938499.html转载于:https://www.cnblogs.com/cp-miao/p/5750211.html

vs2019 缺android sdk,VS2019由于缺少NuGet Microsoft.NET.Sdk.Functions程序包而无法加载项目,但也无法添加此程序包(示例代码)...

我在解决方案中拥有的一个项目未在VSE2019中加载。它将引发此错误&#xff1a;C:MyProgramsrcMyProgram.Functions.csproj : error : The project file cannot be opened by the project system, because it is missing some critical imports or the referenced SDK cannot be…

数据库事物操作

事务 什么是事务?转账&#xff1a;1. 给wc账户减1000元2. 给wcxf账户加1000元 当给wc账户减1000元后&#xff0c;抛出了异常&#xff01;这会怎么样呢&#xff1f;我相信从此之后&#xff0c;wc再也不敢转账了。 使用事务就可以处理这一问题&#xff1a;把多个对数据库的操作绑…

通过OpenShift超越云技术

您是否厌倦了为您的应用程序请求新的开发机器&#xff1f; 您是否为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在这里&#…

android+4.4+稳定性,新系统新UI!台电A10h四核安卓4.4.2性能测试

国内著名商标&#xff0c;数码用户首选品牌的台电科技在12月20日全国首发了安卓4.4.2系统&#xff0c;并且运行台电全新tUI同时&#xff0c;支持从安卓4.2系统OTA一键升级至安卓4.4.2系统&#xff01;作为国内首款升级到目前全球最新的Android4.4.2系统之后&#xff0c;整体性能…

网络知识点小结

VMware虚拟机三种联网方法及原理一、Brigde——桥接&#xff1a;默认使用VMnet0 1、原理&#xff1a; Bridge 桥"就是一个主机&#xff0c;这个机器拥有两块网卡&#xff0c;分别处于两个局域网中&#xff0c;同时在"桥"上&#xff0c;运行着程序&#xff0c;让…

在JUnit中超越核心Hamcrest

在通过JUnit和Hamcrest改进对assertEquals的文章中&#xff0c;我介绍了将Hamcrest与JUnit一起使用 。 然后&#xff0c;我查看了JUnit的内置Hamcrest Core Matcher支持 。 在本文中&#xff0c;我将介绍如何将Hamcrest的非核心匹配器与JUnit一起应用。 这些非核心匹配器默认情…

4pics1word android,4 Pics 1 Word

4 Pics 1 Word是一款非常有意思的看图猜词游戏&#xff0c;这款游戏中会给我们四张图片&#xff0c;玩家需要通过图片给出的信息来猜出是哪个词&#xff0c;看西西的介绍你可能以为这是一款千篇一律的看图猜词游戏&#xff0c;不过这里猜的不是中文而是英语单词。4 Pics 1 Word…

页面内锚点定位及跳转方法总结

接着上一篇&#xff0c;其实是一个功能&#xff0c;本来感觉挺简单的一个问题&#xff0c;没想到遇到两个坎儿&#xff0c;无语。。。 上一篇是关于scroll事件绑定的问题&#xff0c;这一篇的问题是&#xff1a;点击锚点跳转到相应DIV的问题。 最简单的方法是锚点用<a>标…

基于android的水稻叶片特征测量系统,基于Android的水稻叶片特征参数测量系统

基于Android的水稻叶片特征参数测量系统路艳1&#xff0c;肖志勇2&#xff0c;3&#xff0c;杨红云2&#xff0c;3*&#xff0c;周琼1&#xff0c;孙玉婷1【摘要】摘要&#xff1a;【目的】提供基于Android的水稻叶片特征参数测量系统&#xff0c;为农学研究提供精准数据。【方…

JAVA学习绘图颜色及其笔画属性设置字体显示文字

package com.graphics;import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date;import javax.swing.*;/*** * author biexiansheng**/ public class DrawString extends JFrame{private Shape rect;//矩形对象private Font font;//字体对象private Date …

lightoj 1044 - Palindrome Partitioning(需要优化的区间dp)

题目链接&#xff1a;http://lightoj.com/volume_showproblem.php?problem1044 题意&#xff1a;求给出的字符串最少能分成多少串回文串。 一般会想到用区间dp暴力3个for但是这里的数据有1000&#xff0c;3个for肯定超时的。 但是这题只是判断回文串有多少个所以可以先预处理一…

对JavaFX Mobile应用程序进行性能分析

注意&#xff1a;本文最初发表于2009年&#xff0c;仅供参考。 请查阅我们其余的JavaFX文章 。 对于每个JavaFX Mobile应用程序开发人员来说&#xff0c;今天都是美好的一天。 你想知道为什么吗&#xff1f; 因为JavaME SDK 3.0已发布。 根据我午休时听到的消息&#xff0c;这是…

第六天20160810

a) 形参与实参 一、 形参为基本数据类型&#xff1a;形参改变&#xff0c;实参不变。 二、 形参为引用数据类型&#xff1a;形参改变&#xff0c;实参通常都会改变。 b) 可变长参数&#xff1a;JDK1.5开始出现 一、可变长参数只能用于…

android原生系统开发板,安卓学习必备开发板-Rayeager PX2

由谷歌主导并推动的移动终端操作系统Android&#xff0c;由于其开源开放的特性&#xff0c;自发布之日起便受到全球各大IT厂商的欢迎。在各厂商的热情推动下&#xff0c;基于Android系统的手机、平板、智能手表等各类产品层出不穷&#xff0c;迅速普及到人们的日常生活&#xf…

变量类型取值范围

ascii&#xff1a;Oct Dec Hex Char──────────────────────────101 65 41 A102 66 42 B103 67 43 C141 97 61 a142 98 62 b143 99 63 c 取值范围&#xff1a;-1 ~ 0xFFFFFFFF ~ 全1127 ~ 0x7F255 ~ 0xFF ~ 11111111 char -128 ~ 127 …