基于黑名单的xss过滤器
/**
* 类名称:AntiXssFilter
* @version
* 类描述:基于黑名单的xss过滤器
* @version
* 创建人:xxx
* @version
* 创建时间:2015年11月3日 下午1:00:11
* @version
* 修改人:xxx 修改时间:2015年11月3日 下午1:00:11
* @version
* 修改备注:
*/
public class AntiXssFilter implements Filter { public void destroy() {
} @SuppressWarnings("unchecked")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response;
res.setContentType("application/json;charset=UTF-8");
// 校验head参数
if(existsXssHeadElement(req)) {
ResponseUtils.toJson(res, IResponseCode.FAIL, "错误的参数");
// res.sendError(404);
return;
}
// 校验body参数
Map<String, String[]> parameterMap = req.getParameterMap();
for (Object key : parameterMap.keySet()) {
String[] val = (String[]) parameterMap.get(key);
for (String v : val) {
if(null != v){
v = URLDecoder.decode(URLDecoder.decode(v, "utf-8"),"utf-8");
}
if(existsXssElement(v)){
ResponseUtils.toJson(res, IResponseCode.FAIL, "错误的参数");
// res.sendError(404);
return;
}
}
}
chain.doFilter(request, response);
} /**
* @Title: existsXssHeadElement
* @Description: 校验header中的参数
* @return: boolean
* @throws UnsupportedEncodingException
*/
private boolean existsXssHeadElement(HttpServletRequest req) throws UnsupportedEncodingException {
// 设备号
String deviceNo = req.getHeader("deviceNo");
if(null != deviceNo){
deviceNo = URLDecoder.decode(URLDecoder.decode(deviceNo, "utf-8"),"utf-8");
if(existsXssElement(deviceNo)) {
return true;
}
}
// 终端
String client = req.getHeader("client");
if(null != client){
client = URLDecoder.decode(URLDecoder.decode(client, "utf-8"),"utf-8");
if(existsXssElement(client)) {
return true;
}
}
// 渠道
String channel = req.getHeader("channel");
if(null != channel){
channel = URLDecoder.decode(URLDecoder.decode(channel, "utf-8"),"utf-8");
if(existsXssElement(channel)) {
return true;
}
}
// app版本号
String version = req.getHeader("version");
if(null != version){
version = URLDecoder.decode(URLDecoder.decode(version, "utf-8"),"utf-8");
if(existsXssElement(version)) {
return true;
}
}
// app版本号序号
String build = req.getHeader("build");
if(null != build){
build = URLDecoder.decode(URLDecoder.decode(build, "utf-8"),"utf-8");
if(existsXssElement(build)) {
return true;
}
}
// ip
String ip = req.getHeader("ip");
if(null != ip){
ip = URLDecoder.decode(URLDecoder.decode(ip, "utf-8"),"utf-8");
if(existsXssElement(ip)) {
return true;
}
}
return false;
} public void init(FilterConfig arg0) throws ServletException {
} /**
* 黑名单
* existsXssElement
* @param
* @return
* @throws
* @author zhuzheng
* @date 2015年11月2日 下午1:12:16
*/
private boolean existsXssElement(String s)
throws UnsupportedEncodingException{
boolean res = false;
s = s.toLowerCase();
res=getIncludeSqlSpecialCharsFlag(s);
if(!res){
res=getIncludeHtmlSpecialCharsFlag(s);
}
return res;
} /**
* 替换一些特殊字符
* replaceSpecialChars
* @param
* @return
* @throws
* @author zhuzheng
* @date 2015年11月2日 下午1:12:16
*/
private String replaceSpecialChars(String s) throws UnsupportedEncodingException {
String specialChar = "";
s = s.replaceAll("(\r|\n|\t|\f|'|\")", "");
s = s.replaceAll("(\r|\n|\t|\f|'|\")", "");
int specialCharsLen = specailCharArray.length;
for (int i = 0; i < specialCharsLen; i++) {
specialChar = specailCharArray[i];
specialChar = URLDecoder.decode(URLDecoder.decode(specialChar, "utf-8"), "utf-8");
s = s.replaceAll(specialChar, "");
}
return s;
} /**
* 判断是否包含html特殊字符
* getIncludeHtmlSpecialCharsFlag
* @param
* @return
* @throws UnsupportedEncodingException
* @throws
* @author zhuzheng
* @date 2015年11月2日 下午1:12:16
*/
private boolean getIncludeHtmlSpecialCharsFlag(String s) throws UnsupportedEncodingException{
boolean res = false;
// s=replaceSpecialChars(s);
if ( //XSS黑名单
s.indexOf("javascript:") != -1 || s.indexOf("document.cookie") != -1
|| s.indexOf("<script") != -1 || s.indexOf("<iframe") != -1
|| s.indexOf("\"><script>") != -1 || s.indexOf("\"<script>") != -1
|| s.indexOf("<img") != -1 || s.indexOf("onclick=") != -1
|| s.indexOf("<style") != -1 || s.indexOf(")//") != -1
|| s.indexOf("\">") != -1 || s.indexOf("<body") != -1
|| s.indexOf("/xss/") != -1 || s.indexOf("onfocus") != -1
|| s.indexOf("alert") != -1 //|| s.indexOf(";") != -1
|| s.indexOf("fromcharcode") != -1 || s.indexOf("eval") != -1
|| s.indexOf("<a") != -1 || s.indexOf("cookie") != -1
|| s.indexOf("document.write") != -1
) {
ExceptionLogger.error("请求拦截可能存在SQL和脚本注入", "请求参数:"+ s , null);
res = true;
}
return res;
}
/**
* 判断是否包含sql特殊字符
* getIncludeSqlSpecialCharsFlag
* @param
* @return
* @throws
* @author zhuzheng
* @date 2015年11月2日 下午1:12:16
*/
private boolean getIncludeSqlSpecialCharsFlag(String s) {
// 过滤掉的sql关键字,可以手动添加
String badStr = "'|and |exec |execute |insert |select |delete |update |count|drop |chr|mid|master|truncate |"
+ "char|declare |sitename|net user|xp_cmdshell|or |like'%|like '%|insert |create |"
+ "table|from|grant|use|group_concat|column_name|"
+ "information_schema.columns|table_schema|union |where |order by |group by ";
String[] badStrs = badStr.split("\\|");
for (int i = 0; i < badStrs.length; i++) {
if (s.indexOf(badStrs[i]) >= 0) {
ExceptionLogger.error("请求拦截可能存在SQL和脚本注入", "请求参数:"+ s , null);
return true;
}
}
return false;
} private String[] specailCharArray = { "%00", "%2B", "%25E3%2580%2580" }; }
基于黑名单的xss过滤器的更多相关文章
- 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss)
1. 简介 XSS,即跨站脚本编制,英文为Cross Site Scripting.为了和CSS区分,命名为XSS. XSS是最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码 ...
- 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于Jsoup)
1. 跨站点脚本编制 风险:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务. 原因:未对用户输入正确执行危险字符清 ...
- WAF指纹识别和XSS过滤器绕过技巧
[译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...
- Chrome和IE的xss过滤器分析总结
chrome的xss过滤器叫xssAuditor,类似IE的xssFilter,但是他们有很大的内在区别 chrome xssAuditor工作原理 chrome的xss检测名称为 xssAudito ...
- XSS过滤器的实现
一.XSS是什么 全称跨站脚本(cross site script)XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去.使别的用户访问 ...
- 绕过基于签名的XSS筛选器:修改HTML
绕过基于签名的XSS筛选器:修改HTML 在很多情况下,您可能会发现基于签名的过滤器只需切换到一个不太熟悉的执行脚本的方法即可.如果失败了,您需要查看混淆攻击的方法. 本文提供了HTML语法可以被混淆 ...
- 基于dom的xss漏洞原理
原文:http://www.anying.org/thread-36-1-1.html转载必须注明原文地址最近看到网络上很多人都在说XSS我就借着暗影这个平台发表下自己对这一块的一些认识.其实对于XS ...
- 基于DOM的XSS注入漏洞简单解析
基于DOM的XSS注入漏洞简单解析http://automationqa.com/forum.php?mod=viewthread&tid=2956&fromuid=21
- 基于Python的XSS测试工具XSStrike使用方法
基于Python的XSS测试工具XSStrike使用方法 简介 XSStrike 是一款用于探测并利用XSS漏洞的脚本 XSStrike目前所提供的产品特性: 对参数进行模糊测试之后构建合适的payl ...
随机推荐
- powershell例子
例子如下: $ErrorActionPreference="Stop" function getlist{ ls D:\tmp2|select name,extension,ful ...
- 设置redis主从出现的问题
314:S 05 Jan 15:12:17.433 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc ...
- MySQL interval()函数
INTERVAL(N,N1,N2,N3,..........) INTERVAL()函数进行比较列表(N,N1,N2,N3等等)中的N值.该函数如果N<N1返回0,如果N<N2返回1,如果 ...
- View手动切换焦点注意事项
这几天一直在解决一个焦点切换的问题,由于是直接用另外一家公司的代码,没有细看.当应用到测试那边,发现了这个问题,而且真机调试有些问题,不能单步调试,后来是看日志才发现这个问题. ViewA包含几个可以 ...
- Oracle基础知识(一)、简介与安装
文章提纲 Oracle简介与发展历程 安装实例(面向普通开发者) 一.Oracle简介与发展历程 中文名称甲骨文公司,全称为甲骨文股份有限公司(甲骨文软件系统有限公司).甲骨文已超越 IBM ,成为继 ...
- Redis安装及实现session共享
一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...
- Latex中插入C语言代码
Latex是一个文本排版的语言,能排版出各种我们想要的效果.而且用代码排版的优点是易于修改板式,因此在文本内容的排版时,Latex应用十分广泛. 当我们需要在Latex中插入代码时,就需要用到 \us ...
- PHP新手常见的一些不好习惯(抄的 有待理解)
1.不写注释(是个好习惯,不过也没必要每个语句都要写) 2.不使用可以提高生产效率的IDE工具 3.不使用版本控制 4.不按照编程规范写代码 5.不使用统一的方法 6.编码前不去思考和计划 7.在执行 ...
- .net项目中上传的图片或者文件太大 无法上传
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M 按照用户的要求 以为直接将限制图片上传大小的设置改下就可 ...
- oracleDBA-D4
1.数据字典: 创建和维护的可修改的系统表..它存放有关数据库和数据库对象的信息. 数据字典=基表+字典视图 2.数据字典所存放的信息: 数据库的逻辑和物理结构(如:表空间和数据文件),数据对象定义的 ...