1. 程式人生 > >Java Web:主動和被動方式檢測安全的框架

Java Web:主動和被動方式檢測安全的框架

一個 mapping web 安全 xls .config 負責 per .net bsp

對於某些敏感的系統例如支付、交易需要為其加固,有必要將可能的攻擊情況考慮進來加以防範,於是有了這麽一個簡易的安全框架。在前輩的代碼上( 詳見 :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 層面已經完成了。

Java Web:主動和被動方式檢測安全的框架