AntiSamy介紹
OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。我們的使命是使應用軟件更加安全,使企業和組織能夠對應用安全風險作出更清晰的決策。目前OWASP全球擁有140個分會近四萬名會員,共同推動了安全標准、安全測試工具、安全指導手冊等應用安全技術的發展。
OWASP AntiSamy項目可以有好幾種定義。從技術角度看,它是一個可確保用戶輸入的HTML/CSS符合應用規范的API。也可以這么說,它是個確保用戶無法在HTML中提交惡意代碼的API,而這些惡意代碼通常被輸入到個人資料、評論等會被服務端存儲的數據中。在Web應用程序中,“惡意代碼”通常是指 Javascript。同時層疊樣式表(CSS)在調用Javascript引擎的時候也會被認為是惡意代碼。當然在很多情況下,一些“正常”的HTML 和CSS也會被用於惡意的目的,所以我們也會對此予以處理。
AnitiSamy下載
官方網站:https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project
項目地址:https://code.google.com/p/owaspantisamy/downloads/list
我們看到Downloads,下載WhereToGet.txt就可以看到下載地址
標准策略文件說明
antisamy-slashdot.xml
Slashdot ( http://www.slashdot.org/ ) 是一個提供技術新聞的網站,它允許用戶用有限 的 HTML 格式的內容匿名回帖。 Slashdot 不僅僅是目前同類中最酷的網站之一,而 且同時也曾是最容易被成功攻擊的網站之一。更不幸的是,導致大部分用戶遭受攻 擊的原由是臭名昭着的 goatse.cx 圖片 ( 請你不要刻意去看 ) 。 Slashdot 的安全策略非 常嚴格:用戶只能提交下列的 html 標簽: <b>, <u>, <i>,
<a>,<blockquote> ,並且 還不支持 CSS.
因此我們創建了這樣的策略文件來實現類似的功能。它允許所有文本格式的標簽來 直接修飾字體、顏色或者強調作用。
antisamy-ebay.xml
眾所周知, eBay ( http://www.ebay.com/ ) 是當下最流行的在線拍賣網站之一。它是一 個面向公眾的站點,因此它允許任何人發布一系列富 HTML 的內容。 我們對 eBay 成為一些復雜 XSS 攻擊的目標,並對攻擊者充滿吸引力絲毫不感到奇怪。由於 eBay 允許 輸入的內容列表包含了比 Slashdot 更多的富文本內容,所以它的受攻擊面也要大得多。下 面的標簽看起來是 eBay 允許的( eBay 沒有公開標簽的驗證規則) :
<a>,..
antisamy-myspace.xml
MySpace ( http://www.myspace.com/ ) 是最流行的一個社交網站之一。用戶允許提交 幾乎所有的他們想用的 HTML 和 CSS ,只要不包含 JavaScript 。 MySpace 現在用一 個黑名單來驗證用戶輸入的 HTML ,這就是為什么它曾受到 Samy 蠕蟲攻擊 ( http://namb.la/) 的原因。 Samy 蠕蟲攻擊利用了一個本應該列入黑名單的單詞 (eval) 來進行組合碎片攻擊的,其實這也是 AntiSamy 立項的原因。
antisamy-anythinggoes.xml
也很難說出一個用這個策略文件的用例。如果你想允許所有有效的 HTML 和 CSS 元素輸入(但能拒絕 JavaScript 或跟 CSS 相關的網絡釣魚攻擊),你可以使用 這個策略文件。其實即使 MySpace 也沒有這么瘋狂。然而,它確實提供了一個很 好的參考,因為它包含了對於每個元素的基本規則,所以你在裁剪其它策略文件的 時候可以把它作為一個知識庫。
策略文件定制
http://www.owasp.org/index.php/AntiSamy_Directives
AntiSamy.JAVA的使用
首先,老規矩,我們需要一個jar包
使用Maven的,在pom.xml的dependencies中添加如下代碼
<dependency> <groupId>org.owasp.antisamy</groupId> <artifactId>antisamy</artifactId> <version>1.5.3</version> </dependency>
配置web.xml
<!-- XSS --> <filter> <filter-name>XSS</filter-name> <filter-class>com.william.XssFilter</filter-class> </filter> <filter-mapping> <filter-name>XSS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
其中XssFilter為自定義的class,該類必須實現Filter類,在XssFilter類中實現doFilter函數。將策略文件放到和pom.xml平級目錄下,然后我們就開始編寫XssFilter類。
public class XssFilter implements Filter { @SuppressWarnings("unused") private FilterConfig filterConfig; public void destroy() { this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new RequestWrapper((HttpServletRequest) request), response); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } }
OK,我們需要重寫request,新建一個類RequestWrapper,繼承HttpServletRequestWrapper,我們需要重寫getParameterMap()方法,以及過濾非法html的方法xssClean()
public class RequestWrapper extends HttpServletRequestWrapper { public RequestWrapper(HttpServletRequest request) { super(request); } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map<String,String[]> getParameterMap(){ Map<String,String[]> request_map = super.getParameterMap(); Iterator iterator = request_map.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry me = (Map.Entry)iterator.next(); //System.out.println(me.getKey()+":"); String[] values = (String[])me.getValue(); for(int i = 0 ; i < values.length ; i++){ System.out.println(values[i]); values[i] = xssClean(values[i]); } } return request_map; } private String xssClean(String value) { AntiSamy antiSamy = new AntiSamy(); try { Policy policy = Policy.getInstance("antisamy-myspace-1.4.4.xml"); //CleanResults cr = antiSamy.scan(dirtyInput, policyFilePath); final CleanResults cr = antiSamy.scan(value, policy); //安全的HTML輸出 return cr.getCleanHTML(); } catch (ScanException e) { e.printStackTrace(); } catch (PolicyException e) { e.printStackTrace(); } return value; } }
好了,到此為止,我們的AntiSamy就成功添加到項目了。
CSRF 防御方案總結下,無外乎三種:
用戶操作限制,比如驗證碼;
請求來源限制,比如限制 HTTP Referer 才能完成操作;
token 驗證機制,比如請求數據字段中添加一個 token,響應請求時校驗其有效性;
第一種方案明顯嚴重影響了用戶體驗,而且還有額外的開發成本;第二種方案成本最低,但是並不能保證 100% 安全,而且很有可能會埋坑;第三種方案,可取!