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 配置。

[html] view plain copy print?

  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 层面已经完成了。

原文地址:https://www.cnblogs.com/firstdream/p/8309425.html

时间: 2024-08-29 03:58:39

Java Web:主动和被动方式检测安全的框架的相关文章

Java Web应用中自动实时检测资源文件内容变化

在Java Web应用中,我们经常需要配置文件来定制系统行为,这些配置文件可能包括:类路径下的文件和文件夹.非类路径下的绝对路径和相对路径的文件和文件夹,在分布式环境中,还需要通过HTTP从统一集中的Web服务器中获得配置信息,如何对这些配置信息进行自动加载并实时检测变化呢? Java分布式中文分词组件 - word分词已经实现了这个功能,我们看看是如何实现的: package org.apdplat.word.util; import java.io.BufferedReader; impor

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

Tomcat中部署Java Web应用程序的几种方式: #PetWeb是工程名 1.在TOMCAT_HOME\conf\server.xml文件的HOST节点中加入 <Context docBase="F:/workspaces/PetWeb" reloadable="false" path="/Pet"/> 其中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载,这个属性在开

CentOS中vsftpd的主动和被动方式

网址http://blog.csdn.net/nyunyuzhao/article/details/5734978,学习了. FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件.相比于HTTP,FTP协议要复杂得多.复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令:另一个是数据链路,用来上传或下载数据. PORT & PASV FTP协议有两种工作方式:PORT方式和PASV方式,中

Java web项目的解耦合

以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/oracle等等). 随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情,正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精. 大中型公司需要专业人才,小公司需要全才,但是对于个人职业发展来说,我建议是分开.你要是这辈子就吃java这碗饭,就不要去研究什么css,js等等. 把

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

使用Spring Boot来加速Java web项目的开发 我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用gradle来构建的话基本也一样)然后新建Spring相关的xml文件,而且往往那些xml文件还不会少.然后继续使用tomcat或者jetty作为容器来运行这个工程.基本上每次创建一个新的项目都是这么一个流程,而我们有时候仅仅想快速的创建一

第一章 Java Web应用开发技术

1.Java Web应用开发技术 Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支持两类软件的开发和应用,一类是做高级信息系统框架的Web应用服务器(Web Application Server),另一类是在Web服务器上运行的Web应用(Web Application).我们以后所说的Java Web应用开发就是这里的第二类.即在Web服务器上

Spring Boot加速Java web项目的开发

软件152唐伟 我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用gradle来构建的话基本也一样)然后新建Spring相关的xml文件,而且往往那些xml文件还不会少.然后继续使用tomcat或者jetty作为容器来运行这个工程.基本上每次创建一个新的项目都是这么一个流程,而我们有时候仅仅想快速的创建一个Spring web工程来测试一些东西,或

在Java Web Project中实现Vue异步组件加载

背景 最近看上了ElementUI(Vue实现)用来实现一个管理系统Demo,其中一个最常见的需求就是左侧导航不动,右侧主页块在点击导航菜单时动态更新,如下图所示:之前的实现方案是右边嵌入一个iframe,动态更改iframe的url即可,现在既然用了Vue咱也试试单页,是不是显得更优雅.接着就接触到了vue-router.组件.异步组件这些关键字,本以为把页面定义为xxx.vue放到webapp下,然后告诉vue-router去加载就好了,最后发现自己想简单了,思维模式还停留在Java Web

windows + myeclipse 调试 linux + tomcat 的java web服务 配置方式

一.linux tomcat配置和启动 1.catalina.sh第一行添加 declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000" 2.启动JPDA(这是tomcat下的启动方式,别的服务器可能会不一样,但道理是一样的) ./catalina.sh jpda start 3.启动web服务 ./start.sh 二.在windows端的myecli