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>
<!-- // -->

具体防御原理可参见我之前写的博客《 网络信息系统安全检测方案设计()》。

值得注意的是本方案没有考虑 SQL 注入,这是因为 SQL 注入在 DAO 层面已经完成了。

时间: 2024-12-31 02:15:34

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

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

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

Java Web中的入侵检测及简单实现

web 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据.当然,入侵检测可以用很多方法实现,包括软件.硬件防火墙,入侵检测的策略也很多.在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御. 该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新. 我们的入侵

在Java Web中的入侵检测及简单实现

一.简介 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据.当然,入侵检测可以用很多方法实现,包括软件.硬件防火墙,入侵检测的策略也很多.在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御. 该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新. 我们的入

Java Web开发之信息查询方式总结_JSP编程

本文实例讲述了Java Web开发之信息查询方式总结.分享给大家供大家参考.具体如下: 这里介绍的查询方式有: ① 根据某个特定的字段查询: ② 在多个字段中查询: ③ 根据任意字段查询: ④ 任意字段组合查询: ⑤ 多值查询. 根据某个特定的字段进行查询 用户在输入界面中输入要查询的字段的值,然后系统根据这个值进行查找. 下面的实例是根据用户名查询用户的详细信息,简单的效果图如下: 关键代码如下: <p>请输入要查询的姓名:</p> <form action="s

java web jdbc oci 方式连接oracle报错UnsatisfiedLinkError

问题描述 环境为AIX Version 5.3!sqlplus sqlldr 可用,java web jdbc oci 方式连接数据库不成功Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:oci:@

【深入分析Java Web】几种域名解析方式-详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 域名解析记录主要分为A记录.MX记录.CNAME记录.NS记录和TXT记录. A记录: A代表的是Address,用来指定域名对应的IP地址,如将item.taobao.com指定到115.238.23.241,将switch.taobao.com指定到121.14.24.241.A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址. MX记录: 表示的是M

通过CD-ROM分发Java Web Start应用程序

众所周知,Java Web Start (JWS) 支持以基于 Web 的方式来分发应用程序. 既然如此,为何还要通过 CD-ROM 来分发 Java Web Start (JWS) 应用程序呢? 这有许多原因.对于较大的应用程序,完整安装可能会是一项宠大的下载任务, 即便使用高速带宽也无济于事.其次,并非所有的桌面系统都是在线的,并且不 一定都能访问互联网(例如,考虑到公司的安全性).最后,部分人仅仅是喜欢 使用 CD. 一家客户公司曾要求将它们的应用程序分发到世界的任何范围,包括宽带覆盖 不

为什么访问java web工程名可以跳转到前台页面?

问题描述 为什么访问java web工程名可以跳转到前台页面? 为什么访问java web工程名可以跳转到前台页面? 为什么访问java web工程名可以跳转到前台页面? 为什么访问java web工程名可以跳转到前台页面? 解决方案 1.默认tomcat容器的默认页面. <welcome-file-list> <welcome-file>/index.html</welcome-file> </welcome-file-list> 这种方式适合访问静态的页

Java Web Start学习,与JDK中keytool常用命令

Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它获去年全球Java技术最佳创意奖.它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护.这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端,也不用去考虑版本升级后对客户端的维护,这就是JWS提供给我们的好处之一.OK,下面我们就来看看如何玩转