Struts网站基于Filter的XSS漏洞修复
下面的代码只支持struts2框架中的xss漏洞
第一步,创建过滤器XssFilter :
package com.ulic.ulcif.filter; import java.io.IOException; 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 com.ulic.ulcif.requestwrapper.XssHttpServletRequestWrapper; /**
* XSS防跨站脚本攻击过滤器
*
*/
public class XssFilter implements Filter {
FilterConfig filterConfig = null;
/**
* Default constructor.
*/
public XssFilter() {
} public void destroy() {
this.filterConfig = null;
} public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig = fConfig;
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
} }
第二步,创建业务操作XssHttpServletRequestWrapper:
package com.ulic.ulcif.requestwrapper; import java.util.Enumeration;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.dispatcher.StrutsRequestWrapper;
import org.springframework.util.CollectionUtils; /**
* 写一个 Filter,使用 Filter 来过滤浏览器发出的请求。对每个 post 请求的参数过滤一些关键字,替换成安全的,例如:< > ' " \ / # & 。
*
* 方法:实现一个自定义的 HttpServletRequestWrapper,然后在 Filter 里面调用它,替换掉 getParameter 函数即可
*/
public class XssHttpServletRequestWrapper extends StrutsRequestWrapper { HttpServletRequest orgRequest = null; public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
orgRequest = servletRequest;
} /**
* 重写getParameterValues方法
* 通过循环取出每一个请求结果
* 再对请求结果进行过滤
* */
public 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] = cleanXSS(values[i]);
}
return encodedValues;
} /**
* 重写getParameter方法
* 对请求结果进行过滤
* */
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
if (value == null) {
return null;
}
return cleanXSS(value);
} public String getHeader(String name) {
String value = super.getHeader(name);
if (value == null)
return null;
return cleanXSS(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;
} @Override
public Enumeration<String> getParameterNames() {
Enumeration<String> names = super.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
name = cleanXSS(name);
}
return names;
} @Override
public Map getParameterMap() { Map paramMap = super.getParameterMap();
if (CollectionUtils.isEmpty(paramMap)) {
return paramMap;
} for (Object value : paramMap.values()) {
String[] str = (String[])value;
if (str != null) {
for (int i = 0; i < str.length; i++) { str[i] = cleanXSS(str[i]);
}
}
}
return paramMap;
} private String cleanXSS(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", "");
value = value.replaceAll("alert", ""); return value;
}
}
第三步在web.xml中配置:
<filter>
<filter-name>struts-xssFilter</filter-name>
<filter-class>
com.ulic.ulcif.filter.XssFilter
</filter-class>
</filter> <filter-mapping>
<filter-name>struts-xssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到此为止xss在struts2中得到了解决,那么非struts2中xss漏洞怎么解决呢,简单,将第二步换成:如下代码
package com.ulic.ulcif.requestwrapper; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; /**
* 写一个 Filter,使用 Filter 来过滤浏览器发出的请求。对每个 post 请求的参数过滤一些关键字,替换成安全的,例如:< > ' " \ / # & 。
*
* 方法:实现一个自定义的 HttpServletRequestWrapper,然后在 Filter 里面调用它,替换掉 getParameter 函数即可
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { HttpServletRequest orgRequest = null; public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
orgRequest = servletRequest;
} /**
* 重写getParameterValues方法
* 通过循环取出每一个请求结果
* 再对请求结果进行过滤
* */
public 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] = cleanXSS(values[i]);
}
return encodedValues;
} /**
* 重写getParameter方法
* 对请求结果进行过滤
* */
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
if (value == null) {
return null;
}
return cleanXSS(value);
} public String getHeader(String name) {
String value = super.getHeader(name);
if (value == null)
return null;
return cleanXSS(value);
} private String cleanXSS(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", "");
value = value.replaceAll("alert", ""); return value;
}
}
Struts网站基于Filter的XSS漏洞修复的更多相关文章
- php xss漏洞修复用手段和用到的一些函数
php xss漏洞修复用到的一些函数 $text = '<p>"Test paragraph".</p><!-- Comment --> < ...
- 1.5 xss漏洞修复
1.XSS漏洞修复 从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理.因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据 ...
- 基于dom的xss漏洞原理
原文:http://www.anying.org/thread-36-1-1.html转载必须注明原文地址最近看到网络上很多人都在说XSS我就借着暗影这个平台发表下自己对这一块的一些认识.其实对于XS ...
- [PoC]某B2B网站的一个反射型XSS漏洞
Author: Charlie 个人微博:http://YinYongYou.com 转载请注明出处. 工作过程纯粹手贱,测试了一下.然后发现了这么一个东西.有心利用能造成大范围影响.如可以自由修改用 ...
- xss漏洞修复,待完善
1.防止sql注入 /// <summary> /// 分析用户请求是否正常 /// </summary> /// <param name="Str" ...
- JSONP 安全攻防技术(JSON劫持、 XSS漏洞)
关于 JSONP JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案.他实现的基本原理是利用了 HTML 里 <script&g ...
- 使用Fiddler的X5S插件查找XSS漏洞
OWASP top 10的安全威胁中的CrossSite Scripting(跨站脚本攻击),允许攻击者通过浏览器往网站注入恶意脚本.这种漏洞经常出现在web应用中需要用户输入的地方,如果网站有XSS ...
- dedecms5.7最新漏洞修复
最近发现织梦cms被挂马现象频繁,解决好好几个网站的问题,但是过不了多久,就又被攻击了,即使更改系统及ftp密码,也没有起到防御的作用,最后怀疑cms本身漏洞,于是采用工具扫描了一下,才发现问题的严重 ...
- XSS漏洞解决方案之一:过滤器
一:web.xml文件 <!-- 解决xss漏洞 --> <filter> <filter-name>xssFilter</filter-name> ...
随机推荐
- file常用功能
构造方法 File(String pathname):将指定的路径名转换成一个File对象 File f = new File("D:\\a\\b.txt"); File(Stri ...
- VS 提示对象被多次指定;已忽略多余的指定
最近有一个工程编译老是出现这个问题,网上的解决方案说是工程目录下有同名的源文件,所以编译出了同名的obj.然而我检查了一下并没有.经尝试,把所有文件从项目中移除再重新添加进来就行了..应该是因为我反复 ...
- Python下划线简介
Python中下划线的5种含义 分享一篇文章:The Meaning of Underscores in Python. 本文介绍了Python中单下划线和双下划线("dunder" ...
- MongoDB - 1
MongoDB - 1 一.初识MongoDB 之 什么东西都得先从理论入手,你说是不是啊? MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展 ...
- jq动画设置图片抽奖(修改效果版)
效果:点击开始,图片转动,按钮显示"停止",点击停止,选出中奖号码,,最后一个数字停止时,按钮变为"again",点击"again"开始转动 ...
- 数据结构python编程总结
大数据.空间限制 布隆过滤器 使用很少的空间就可以将准确率做到很高的程度(网页黑名单系统.垃圾邮件过滤系统.爬虫的网址判重系统等) 有一定的失误率 单个样本的大小不影响布隆过滤器的大小 n个输入.k个 ...
- 区间dp(入门题)
区间dp:顾名思义就是在区间上进行动态规划,通过合并小区间求解一段区间上的最优解. 常见模板: for(int len=1;len<n;len++){//区间长度 for(int be=1;be ...
- CentOS7.2 1511部署RabbitMQ
一.安装RabbitMQ依赖的的Erlang最小支持包(当然也可以安装完整的Erlang) 1.下载RabbitMQ的Erlang最小支持包源文件 git clone https://github.c ...
- windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,帮其解决后,发现很多人遇到过这样的问题,因此写着这里. 也许你没 ...
- 关于egg.js的安全延伸思考
我看到全部的安全基于围绕http来操作,那么如果我只用websocket传输数据,是不是就会好很多?