Java Web:主动和被动方式检测安全的框架
对于某些敏感的系统例如支付、交易需要为其加固,有必要将可能的攻击情况考虑进来加以防范,于是有了这么一个简易的安全框架。在前辈的代码上( 详见 :http://blog.csdn.net/zhongweijian/article/details/8680737)我大幅度重构,更好地理解 Java Web 安全实施措施。
源代码在:http://git.oschina.net/sp42/ajaxjs/tree/master/ajaxjs-security?dir=1&filepath=ajaxjs-security
该框架基于 Sevlet 过滤器和若干 HttpServletRequest/HttpServletResponse 覆盖的方式增加一些输入输出的过滤。如下表格显示了可支持的哪些攻击。
| 作用 | 对应类名 | 加载方式 | init-param |
|---|---|---|---|
| XSS过滤 | com.ajaxjs.web.security.wrapper.XSS_Request/XSS_Response | wrapper | enableXSSFilter |
| Header CLRF 过滤 | com.ajaxjs.web.security.wrapper.CLRF_Response | wrapper | enableCLRF_Filter |
| Cookies Key 验证和大小验证 | com.ajaxjs.web.security.wrapper.CookieRequest/CookieResponse | wrapper | cookieWhiteList(配置白名单) |
| 文件上传后缀验证 | com.ajaxjs.web.security.wrapper.UploadRequest | wrapper | uploadfileWhiteList(配置白名单) |
| CSRF 攻击 | com.ajaxjs.web.security.filter.CSRF | filter | encryCookieKey(配置 key) |
| Session 通过加密存储到 cookie | com.ajaxjs.web.security.filter.EncrySessionInCookie | filter | encryCookieKey(配置 key) |
| POST 白名单/黑名单机制验证 | com.ajaxjs.web.security.filter.Post | filter | postWhiteList/postBlackList(配置白名单/黑名单) |
| Referer 来路检测 | com.ajaxjs.web.security.filter.RefererFilter | filter | RefererFilter(配置 key) |
所有检测都由 ConfigLoader 负责读取配置和启动。是否启动某项功能取决于配置有否,只要有配了的话,该功能点就生效,反之则不启用。如表格上的 init-param 对应的是 web.xml 里面配置的内容。
加载方式指的是在 filter 中主动检测,一般是执行 check() 方法,传入 request/response 即可;而 wrapper 是指被动方式检测、过滤,具体说是对 Java API 方式覆盖来包含检测手段,类似于设计模式的 Template 模版方法,使得调用者在不改变 API 的前提下又能加入新的逻辑。特别地可以了解下 HttpServletRequestWrapper/HttpServletResponseWrapper 这两个原生 API。
使用方法:引入 jar 包并添加 web.xml 配置。
- <!-- 防御 -->
- <filter>
- <filter-name>SecurityFilter</filter-name>
- <filter-class>com.ajaxjs.web.security.ConfigLoader</filter-class>
- <!-- 是否启动 XSS 过滤 -->
- <init-param>
- <param-name>enableXSSFilter</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- 是否启动 CLRF 过滤 -->
- <init-param>
- <param-name>enableCLRF_Filter</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- Session 通过加密存储到 cookie -->
- <init-param>
- <param-name>encryCookieKey</param-name>
- <param-value>1234567887654321</param-value>
- </init-param>
- <!-- Cookies 白名单机制验证和大小验证 -->
- <init-param>
- <param-name>cookieWhiteList</param-name>
- <param-value>id,JESSIONID,name,clrf</param-value>
- </init-param>
- <!-- 文件上传后缀白名单 过滤 -->
- <init-param>
- <param-name>uploadfileWhiteList</param-name>
- <param-value>jpg,png,doc,xls</param-value>
- </init-param>
- <!-- CSRF 攻击 过滤 -->
- <init-param>
- <param-name>CSRF_Filter</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- POST 白名单/黑名单机制验证(支持正则匹配) -->
- <init-param>
- <param-name>postWhiteList</param-name>
- <param-value>/d/sssecurity, /user/aaa/name*</param-value>
- </init-param>
- <init-param>
- <param-name>postBlackList</param-name>
- <param-value>true</param-value>
- </init-param>
- <!-- 配置 Security 异常发生后跳转 url 参数 -->
- <init-param>
- <param-name>redirectUrlt</param-name>
- <param-value>http://localhost:8080/[0-9A-Za-z]*,http://www.taobao.com/[0-9A-Za-z]*</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>SecurityFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- // -->
<!-- 防御 -->
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>com.ajaxjs.web.security.ConfigLoader</filter-class> <!-- 是否启动 XSS 过滤 -->
<init-param>
<param-name>enableXSSFilter</param-name>
<param-value>true</param-value>
</init-param> <!-- 是否启动 CLRF 过滤 -->
<init-param>
<param-name>enableCLRF_Filter</param-name>
<param-value>true</param-value>
</init-param> <!-- Session 通过加密存储到 cookie -->
<init-param>
<param-name>encryCookieKey</param-name>
<param-value>1234567887654321</param-value>
</init-param> <!-- Cookies 白名单机制验证和大小验证 -->
<init-param>
<param-name>cookieWhiteList</param-name>
<param-value>id,JESSIONID,name,clrf</param-value>
</init-param> <!-- 文件上传后缀白名单 过滤 -->
<init-param>
<param-name>uploadfileWhiteList</param-name>
<param-value>jpg,png,doc,xls</param-value>
</init-param> <!-- CSRF 攻击 过滤 -->
<init-param>
<param-name>CSRF_Filter</param-name>
<param-value>true</param-value>
</init-param> <!-- POST 白名单/黑名单机制验证(支持正则匹配) -->
<init-param>
<param-name>postWhiteList</param-name>
<param-value>/d/sssecurity, /user/aaa/name*</param-value>
</init-param>
<init-param>
<param-name>postBlackList</param-name>
<param-value>true</param-value>
</init-param> <!-- 配置 Security 异常发生后跳转 url 参数 -->
<init-param>
<param-name>redirectUrlt</param-name>
<param-value>http://localhost:8080/[0-9A-Za-z]*,http://www.taobao.com/[0-9A-Za-z]*</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- // -->
具体防御原理可参见我之前写的博客《 网络信息系统安全检测方案设计(上、下)》。
值得注意的是本方案没有考虑 SQL 注入,这是因为 SQL 注入在 DAO 层面已经完成了。
Java Web:主动和被动方式检测安全的框架的更多相关文章
- Java web 项目 tomcat部署方式.
本地做Java Web项目的时候常常会用到tomcat部署测试的问题, 这里介绍项目的部署方法: 1,配置文件的形式: 例如: 你的项目目录为:f:\workspaces\MyProject,此时使用 ...
- Tomcat中部署Java Web应用程序的方式
Tomcat中部署Java Web应用程序的几种方式: #PetWeb是工程名 1.在TOMCAT_HOME\conf\server.xml文件的HOST节点中加入 <Context docBa ...
- CentOS中vsftpd的主动和被动方式
网址http://blog.csdn.net/nyunyuzhao/article/details/5734978,学习了. FTP是File Transfer Protocol(文件传输协议)的缩写 ...
- Java Web连接各种数据库方式汇总
1.Oracle数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String ...
- java web项目为什么我们要放弃jsp?
前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...
- 第一章 Java Web应用开发技术
Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支 ...
- java web项目为什么我们要放弃jsp?(转)
前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...
- 使用Spring Boot来加速Java web项目的开发
我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...
- 全网最详细的Eclipse和MyEclipse里对于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)
不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 全网最详细的MyEclipse里如何正确新建普通的Java web项目并发 ...
随机推荐
- LeetCode8. 字符串转整数 (atoi)
8. 字符串转整数 (atoi) 描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连 ...
- LeetCode记录之14——Longest Common Prefix
本题虽然是easy难度,题目也一目了然,问题就是在这里,需要考虑的特殊情况太多,太多限制.导致我一点点排坑,浪费了较多时间. Write a function to find the longest ...
- cmder 常用快捷键
双Tab,用于补全 Ctrl+T,建立新页 Ctrl+W,关闭标签页 Ctrl+Tab,切换标签页 Alt+F4,关闭所有标签页 Ctrl+1,切换到第一个页签,Ctrl+2同理 Alt + ente ...
- let 和 var 的区别笔记
参考文章:阮一峰 ECMAScript 6 入门 ES6中新增加了 let 声明,它跟 var 的区别如下: 1.作用域不同,let 只在代码块中有效 { var a = '123'; le ...
- dataTable 加了竖向滚动条导致列头样式错位的问题 / 亲测可用,不好用你打我,用好了记得点推荐
tab在没有显示之前,容器是没有高度宽度的,而dt在自动计算高度和宽度时是获取的外部容器的高度和宽度,当切换tab时,dt获取不到这个高度宽度,导致列头都挤在一起,是用下面代码解决此问题 $('a[d ...
- UESTC - 621
f[n]:sigma(i,n),i<n g[n]:sigmaf[i],i<=n #include<bits/stdc++.h> using namespace std; con ...
- 不要重复发明轮子-C++STL
闫常友 著. 中国铁道出版社. 2013/5 标准的C++模板库,是算法和其他一些标准组件的集合. . 1.类模板简介 2.c++中的字符串 3.容器 4.c++中的算法 5.迭代器 6.STL 数值 ...
- 移动端bug和优化
1.字体兼容bug 描叙:ios默认字体和andriod不一样,需要设置html的默认字体样式例子:font-family: PingFang-SC-Regular,Helvetica,sans-se ...
- Q443 压缩字符串
给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...