XSS 的認識與防護策略
VSole2021-10-15 07:30:55
什么是 XSS
XSS,是一種代碼注入攻擊。攻擊者通過在目標網站上注入惡意腳本,用戶訪問網站后不知不覺就執行了腳本,攻擊者可獲取用戶的敏感信息,如 Cookie、SessionID 等。
XSS 的本質是:惡意代碼沒有經過過濾,與網站正常的代碼混在一起;瀏覽器無法分辨哪些腳本是可信的,導致惡意腳本被執行。
XSS 分類
根據攻擊的來源,XSS 攻擊可分為存儲型、反射型和 DOM 型三種。

防止 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 的攻擊步驟:
- 攻擊者將惡意代碼提交到目標網站的數據庫中。
- 用戶打開目標網站時,網站服務端將惡意代碼從數據庫取出,拼接在 HTML 中返回給瀏覽器。
- 用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
這種攻擊常見于公開用戶提交數據(UGC 內容)的網站功能,如論壇發帖、商品評論、用戶私信等。
反射型 XSS
反射型 XSS 的攻擊步驟:
- 攻擊者構造出特殊的 URL,其中包含惡意代碼。
- 用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。
- 用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫里,反射型 XSS 的惡意代碼存在 URL 里。
反射型 XSS 漏洞常見于通過 URL 傳遞參數的功能,如網站搜索、跳轉等。由于需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。
DOM 型 XSS
DOM 型 XSS 的攻擊步驟:
- 攻擊者構造出特殊的 URL,其中包含惡意代碼。
- 用戶打開帶有惡意代碼的 URL。
- 用戶瀏覽器接收到響應后解析執行,前端 JavaScript 取出 URL 中的惡意代碼并執行。
DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬于前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬于服務端的安全漏洞。
VSole
網絡安全專家