2015-07-03 18 views
0

節省實際值在通過AppScan的我們的基於Java的Web應用程序的最新掃描結果發現,該應用程序是容易產生XSS攻擊。 我做了我的研究,發現ServletFilter可能是保護應用程序的最簡單方法。 我引入了擴展HttpServletRequestWrapper的過濾器(因爲java不允許更改請求參數,所以沒有request.setParam方法)。我有一個介紹的sanitize方法,這裏是做什麼的預防的Java Web應用程序XSS攻擊,而在數據庫

result = ESAPI.encoder().canonicalize(input); 

// Avoid null characters 
result = result.replaceAll("\0", ""); 

// Clean out HTML 
result = Jsoup.clean(result, Whitelist.none()); 

後這種變化,這是很好的,我測試了XSS vulnerabilites我和大多數是固定的。但是這造成了另一個問題。假設我有一個形式,創造一種產品,並在產品名稱的用戶進入類似

<script>alert('somethingStupid')</script> 

現在理想我應該能夠這樣保存到數據庫中,但仍然可以從XSS攻擊的保護。不知道在我的過濾器或其他任何地方做什麼可以做到這一點。

回答

2

HTML噴射爲輸出級的問題,由於忘記將其注入一個上下文,其中字符是特殊的,當以編碼文本。 ESAPI提供各種上下文的編碼器,正如@Zakaria所討論的。如果您在正確的上下文中持續使用這些內容,則已經修復了與注射相關的XSS問題。

如果您使用的是像<c:out>您的模板純粹的JSTL標籤,這些也將HTML轉義默認。一般來說,最好使用模板化系統生成HTML,HTML系統會自動爲您排除HTML,因爲否則您可能會忘記手動編碼encodeForHTML。 (另外:在我被迫使用最可怕的owasp-esapi-java庫的項目中,我的首選是encodeForXML而不是HTML編碼器,因爲它會產生對HTML內容和引用屬性值安全的輸出同時不會不必要地嘗試爲非ASCII字符生成實體引用。我通常會盡量避免注入JavaScript字符串文字;通常將運行時內容注入到HTML data-屬性中並從單獨的JavaScript DOM代碼中讀取它們通常更容易和更易於維護。)

試圖在輸入階段過濾掉HTML是一種可悲的仍然流行但完全誤導的方法。它可以防止您在需要時輸入類似HTML的輸入,就像您發現的那樣,使用<script>示例。的確,如果StackOverflow使用這樣的輸入過濾器,我們將無法進行這種對話。

更重要的是,它不具有彈性:有很多方法可以通過輸入過濾器走私潛在的注入。爲了使過濾器有效,你必須考慮阻止幾乎所有的標點符號,這通常是不被接受的。此外,通過請求參數以外的方式進入您的應用程序的任何數據都不會被審查。

輸入驗證非常適合在特定輸入字段的格式上執行業務規則,並且可用於過濾不想要的輸入,如控制字符。但是,擔心轉義或刪除HTML是錯誤的地方。做這件事的時候是你創建HTML的時候。

0

跨站腳本處理(XSS)是當沒有驗證用戶輸入的機構,以便其結果將是一個可利用的JavaScript代碼通常時發生的安全問題。

3種類型的XSS的是已知的:自反XSS,基於DOM的XSS和持久性XSS。

在你的情況下,由於你使用的是OWASP ESAPI,所以規範化輸入是不夠的,確保它是防止SRC或HREF屬性中的不可信URL的好方法,但這還不夠。

你應該遵循的規則帖前:源(XSS (Cross Site Scripting) Prevention Cheat Sheet of OWASP)(在這裏是爲進一步閱讀的一些規則遵循的鏈接):

1- HTML逃生插入不可信數據到HTML元素內容之前:看這個例子:

String safe = ESAPI.encoder().encodeForHTML(request.getParameter("input")); 

2-屬性逃生插入不可信數據轉換成HTML普通之前屬性:

String safe = ESAPI.encoder().encodeForHTMLAttribute(request.getParameter("input")); 

3- JavaScript的逃生Befor Ë插入不可信數據到JavaScript數據值:

String safe = ESAPI.encoder().encodeForJavaScript(request.getParameter("input"));