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?
- <!-- 防禦 -->
- <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:主動和被動方式檢測安全的框架