防禦XSS攻擊:基於白名單的富文字XSS後端過濾(jsoup)
簡介:
跨站指令碼攻擊(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。
攻擊原理:XSS攻擊分為很多,其中一種是,攻擊者往Web頁面裡插入惡意Script程式碼,當用戶瀏覽該頁面時,嵌入其中的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。本文主要介紹的是富文字的script程式碼注入及解決辦法。
因為富文字編輯器本身就是基於HTML的,所以要儲存富文字格式,就一定要儲存HTML程式碼,也就一定會向伺服器傳送HTML格式的字串,而且使用者也可能在富文字編輯器內編寫一段HTML程式碼,那麼這樣的話又怎麼區分呢?
防禦方法:
防禦XSS攻擊可以從前端和後端入手。
前端防禦:使用js,由客戶端執行,將 '&' , '<' , '\' 之類的敏感字元轉義為 & , < , >,使用者所編寫的HTML程式碼就變成了字元,剩下的才是富文字格式。優點是可以直接在客戶端執行,不需要佔用伺服器資源。但缺點是,如果攻擊者使用偽造的HTTP請求,直接向伺服器傳送一段HTML程式碼,或者禁用js,則可以繞過前端處理及檢查,直接向伺服器提交包含script的HTML程式碼。這時就需要在伺服器進行防禦了。
後端防禦:在伺服器檢查敏感的HTML程式碼,有基於黑名單和基於白名單的兩種過濾方式。因為HTML標籤種類繁多,基於黑名單的過濾方法考慮的並不全面。而且對偽協議的考慮也不全面等等。。所以這裡介紹的是一種基於白名單
Jsoup使用步驟:
1.在pom中新增版本控制
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
2.新建白名單Whitelist
新建白名單公有6種方法,一個構造方法和5種靜態方法。不同的方法所新建的Whitelist擁有不同的初始標籤白名單。使用add,remove方法也可以增刪白名單內容。需要注意的是preserveRelativeLinks(boolean preserve)這個方法。在選擇true,可以使用相對路徑後,呼叫Jsoup.clean()方法時,不能使用兩引數的那個方法,必須傳baseUrl這個引數,否則還是會刪除相對路徑。樣例程式碼如下:
String html = "";//接收到的html程式碼
//防禦XSS攻擊,安全HTML驗證
//可自定義jsoup的Whitelist
Whitelist whitelist = Whitelist.relaxed();
//其它白名單設定...
//獲得安全HTML,消除xss隱患
String safeHtml = Jsoup.clean(html, whitelist);
System.out.println(safeHtml);
至此,基於白名單的富文字XSS後端過濾就完成啦。。。