XSS 防禦策略

什麼是 XSS

XSS,是一種代碼注入攻擊。攻擊者經過在目標網站上注入惡意腳本,用戶訪問網站後不知不覺就執行了腳本,攻擊者可獲取用戶的敏感信息,如 Cookie、SessionID 等。css

XSS 的本質是:惡意代碼沒有通過過濾,與網站正常的代碼混在一塊兒;瀏覽器沒法分辨哪些腳本是可信的,致使惡意腳本被執行。html

XSS 分類

根據攻擊的來源,XSS 攻擊可分爲存儲型、反射型和 DOM 型三種。前端

類型 存儲區 插入點
存儲型 XSS 後端數據庫 HTML
反射型 XSS URL HTML
DOM 型 XSS 後端數據庫/前端存儲/URL 前端 JavaScript

防止 XSS 攻擊

預防存儲型和反射型 XSS 攻擊

存儲型和反射型 XSS 都是在服務端取出惡意代碼後,插入到響應 HTML 裏的;所以預防這兩種漏洞,有兩種常見作法:數據庫

  • 對文本內容作充分轉義
  • 標籤和屬性基於白名單過濾:對於富文本編輯器來講,其產物自己就是 html 代碼,因此沒辦法簡單粗暴使用轉義來處理,應該要對內容中的標籤和屬性,基於白名單進行過濾。(附 XSS 黑名單:DOM 中的內聯事件監聽器如onclick等、<a>標籤的href屬性、<script>標籤、css 中的url功能)

預防 DOM 型 XSS 攻擊

不要直接把後端傳來的數據做爲 html 來渲染,好比innerHtml()/outerHtml()/document.write()等方法,又好比 Vue 的v-html;儘可能使用textContent/setAttribute()後端

CSP

嚴格的 CSP 在 XSS 的防範中能夠起到如下的做用:瀏覽器

  • 禁止加載外域代碼,防止複雜的攻擊邏輯。
  • 禁止內聯腳本執行。
  • 禁止外域提交,網站被攻擊後,用戶的數據不會泄露到外域。
  • 合理使用上報能夠及時發現 XSS,利於儘快修復問題。

其餘安全措施

  • HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也沒法竊取此 Cookie。
  • 驗證碼:防止腳本冒充用戶提交危險操做。

附三種 XSS 攻擊分類的詳細解釋

存儲型 XSS

存儲型 XSS 的攻擊步驟:安全

  1. 攻擊者將惡意代碼提交到目標網站的數據庫中。
  2. 用戶打開目標網站時,網站服務端將惡意代碼從數據庫取出,拼接在 HTML 中返回給瀏覽器。
  3. 用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行。

這種攻擊常見於公開用戶提交數據(UGC 內容)的網站功能,如論壇發帖、商品評論、用戶私信等。編輯器

反射型 XSS

反射型 XSS 的攻擊步驟:網站

  1. 攻擊者構造出特殊的 URL,其中包含惡意代碼。
  2. 用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。
  3. 用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行。

反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫裏,反射型 XSS 的惡意代碼存在 URL 裏。url

反射型 XSS 漏洞常見於經過 URL 傳遞參數的功能,如網站搜索、跳轉等。因爲須要用戶主動打開惡意的 URL 才能生效,攻擊者每每會結合多種手段誘導用戶點擊。

DOM 型 XSS

DOM 型 XSS 的攻擊步驟:

  1. 攻擊者構造出特殊的 URL,其中包含惡意代碼。
  2. 用戶打開帶有惡意代碼的 URL。
  3. 用戶瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。

DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其餘兩種 XSS 都屬於服務端的安全漏洞。

相關文章
相關標籤/搜索