1. 程式人生 > >防禦XSS攻擊:基於白名單的富文字XSS後端過濾(jsoup)

防禦XSS攻擊:基於白名單的富文字XSS後端過濾(jsoup)

簡介:

跨站指令碼攻擊(Cross Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。 

攻擊原理:XSS攻擊分為很多,其中一種是,攻擊者往Web頁面裡插入惡意Script程式碼,當用戶瀏覽該頁面時,嵌入其中的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。本文主要介紹的是富文字的script程式碼注入及解決辦法。

因為富文字編輯器本身就是基於HTML的,所以要儲存富文字格式,就一定要儲存HTML程式碼,也就一定會向伺服器傳送HTML格式的字串,而且使用者也可能在富文字編輯器內編寫一段HTML程式碼,那麼這樣的話又怎麼區分呢?

防禦方法:

防禦XSS攻擊可以從前端後端入手。

前端防禦使用js,由客戶端執行,將 '&' , '<' , '\' 之類的敏感字元轉義為 &amp , &lt , &gt,使用者所編寫的HTML程式碼就變成了字元,剩下的才是富文字格式。優點是可以直接在客戶端執行,不需要佔用伺服器資源。但缺點是,如果攻擊者使用偽造的HTTP請求,直接向伺服器傳送一段HTML程式碼,或者禁用js,則可以繞過前端處理及檢查,直接向伺服器提交包含script的HTML程式碼。這時就需要在伺服器進行防禦了。

後端防禦在伺服器檢查敏感的HTML程式碼,有基於黑名單和基於白名單的兩種過濾方式。因為HTML標籤種類繁多,基於黑名單的過濾方法考慮的並不全面。而且對偽協議的考慮也不全面等等。。所以這裡介紹的是一種基於白名單

的過濾方法,使用jsoup處理接收到的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後端過濾就完成啦。。。