对于某些敏感的系统例如支付、交易需要为其加固,有必要将可能的攻击情况考虑进来加以防范,于是有了这么一个简易的安全框架。在前辈的代码上( 详见 :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 配置。

  1. <!-- 防御 -->
  2. <filter>
  3. <filter-name>SecurityFilter</filter-name>
  4. <filter-class>com.ajaxjs.web.security.ConfigLoader</filter-class>
  5. <!-- 是否启动 XSS 过滤 -->
  6. <init-param>
  7. <param-name>enableXSSFilter</param-name>
  8. <param-value>true</param-value>
  9. </init-param>
  10. <!-- 是否启动 CLRF 过滤 -->
  11. <init-param>
  12. <param-name>enableCLRF_Filter</param-name>
  13. <param-value>true</param-value>
  14. </init-param>
  15. <!-- Session 通过加密存储到 cookie -->
  16. <init-param>
  17. <param-name>encryCookieKey</param-name>
  18. <param-value>1234567887654321</param-value>
  19. </init-param>
  20. <!-- Cookies 白名单机制验证和大小验证 -->
  21. <init-param>
  22. <param-name>cookieWhiteList</param-name>
  23. <param-value>id,JESSIONID,name,clrf</param-value>
  24. </init-param>
  25. <!-- 文件上传后缀白名单 过滤 -->
  26. <init-param>
  27. <param-name>uploadfileWhiteList</param-name>
  28. <param-value>jpg,png,doc,xls</param-value>
  29. </init-param>
  30. <!-- CSRF 攻击 过滤 -->
  31. <init-param>
  32. <param-name>CSRF_Filter</param-name>
  33. <param-value>true</param-value>
  34. </init-param>
  35. <!-- POST 白名单/黑名单机制验证(支持正则匹配) -->
  36. <init-param>
  37. <param-name>postWhiteList</param-name>
  38. <param-value>/d/sssecurity, /user/aaa/name*</param-value>
  39. </init-param>
  40. <init-param>
  41. <param-name>postBlackList</param-name>
  42. <param-value>true</param-value>
  43. </init-param>
  44. <!-- 配置 Security 异常发生后跳转 url 参数 -->
  45. <init-param>
  46. <param-name>redirectUrlt</param-name>
  47. <param-value>http://localhost:8080/[0-9A-Za-z]*,http://www.taobao.com/[0-9A-Za-z]*</param-value>
  48. </init-param>
  49. </filter>
  50. <filter-mapping>
  51. <filter-name>SecurityFilter</filter-name>
  52. <url-pattern>/*</url-pattern>
  53. </filter-mapping>
  54. <!-- // -->
<!-- 防御 -->
<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:主动和被动方式检测安全的框架的更多相关文章

  1. Java web 项目 tomcat部署方式.

    本地做Java Web项目的时候常常会用到tomcat部署测试的问题, 这里介绍项目的部署方法: 1,配置文件的形式: 例如: 你的项目目录为:f:\workspaces\MyProject,此时使用 ...

  2. Tomcat中部署Java Web应用程序的方式

    Tomcat中部署Java Web应用程序的几种方式: #PetWeb是工程名 1.在TOMCAT_HOME\conf\server.xml文件的HOST节点中加入 <Context docBa ...

  3. CentOS中vsftpd的主动和被动方式

    网址http://blog.csdn.net/nyunyuzhao/article/details/5734978,学习了. FTP是File Transfer Protocol(文件传输协议)的缩写 ...

  4. Java Web连接各种数据库方式汇总

    1.Oracle数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String ...

  5. java web项目为什么我们要放弃jsp?

    前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...

  6. 第一章 Java Web应用开发技术

    Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支 ...

  7. java web项目为什么我们要放弃jsp?(转)

    前戏: 以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/Oracle等等). 随着时代的发展,渐渐的许多 ...

  8. 使用Spring Boot来加速Java web项目的开发

    我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...

  9. 全网最详细的Eclipse和MyEclipse里对于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 全网最详细的MyEclipse里如何正确新建普通的Java web项目并发 ...

随机推荐

  1. LeetCode记录之27——Remove Element

    这道题跟26题很类似,并且有官方的答案.看了官方的答案之后发现写得特别巧,自己做的题太少思路太窄.有意思的是我的算法的时间复杂度是O(N^2),官方的是O(N),我的实际运行时间还少了2ms. ive ...

  2. JAVA数据结构--选择排序

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...

  3. [转] node.js如何获取时间戳与时间差

    [From] http://www.jb51.net/article/89767.htm Nodejs中获取时间戳的方法有很多种,例如: 1.new Date().getTime()  2.Date. ...

  4. nginx 地址重写

    例如, www.baidu.com    跳到   www.baidu.com/index.html #if ( $http_host ~* "^(.*)\.baidu\.com$" ...

  5. 论文笔记 | Self-organized Text Detection with Minimal Post-processing via Border Learning

    论文链接:http://openaccess.thecvf.com/content_ICCV_2017/papers/Wu_Self-Organized_Text_Detection_ICCV_201 ...

  6. python3 模块安装列表

    pip install scrapy pip install twisted pip install BeautifulSoup4 pip install lxml pip install Pillo ...

  7. 转载收藏(js数组方法大全)

    js数组方法大全 JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组var arr2 = new Arra ...

  8. string查找字符(串)

    在C语言中 strchr 和 strstr函数都被包含在<string.h>头文件中,也就是要调用它们时要在程序前面包含<string.h>头文件,也就是写这个语句:#incl ...

  9. 4~20mA转0~5V

    RCV420是一种精密的I/V转换电路,也是目前最佳的4-20mA转换0-5V的电路方案,有商用级(0℃-70℃)和工业级(-25℃-+85℃)供你选购 301欧姆为精度1%. RCV420运行40m ...

  10. (转)同步异步,阻塞非阻塞 和nginx的IO模型

    同步异步,阻塞非阻塞 和nginx的IO模型  原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...