XSS,是一種代碼注入攻擊。攻擊者經過在目標網站上注入惡意腳本,用戶訪問網站後不知不覺就執行了腳本,攻擊者可獲取用戶的敏感信息,如 Cookie、SessionID 等。css
XSS 的本質是:惡意代碼沒有通過過濾,與網站正常的代碼混在一塊兒;瀏覽器沒法分辨哪些腳本是可信的,致使惡意腳本被執行。html
根據攻擊的來源,XSS 攻擊可分爲存儲型、反射型和 DOM 型三種。前端
類型 | 存儲區 | 插入點 |
---|---|---|
存儲型 XSS | 後端數據庫 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 後端數據庫/前端存儲/URL | 前端 JavaScript |
存儲型和反射型 XSS 都是在服務端取出惡意代碼後,插入到響應 HTML 裏的;所以預防這兩種漏洞,有兩種常見作法:數據庫
onclick
等、<a>
標籤的href
屬性、<script>
標籤、css 中的url
功能)不要直接把後端傳來的數據做爲 html 來渲染,好比innerHtml()/outerHtml()/document.write()
等方法,又好比 Vue 的v-html
;儘可能使用textContent/setAttribute()
。後端
嚴格的 CSP 在 XSS 的防範中能夠起到如下的做用:瀏覽器
存儲型 XSS 的攻擊步驟:安全
這種攻擊常見於公開用戶提交數據(UGC 內容)的網站功能,如論壇發帖、商品評論、用戶私信等。編輯器
反射型 XSS 的攻擊步驟:網站
反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫裏,反射型 XSS 的惡意代碼存在 URL 裏。url
反射型 XSS 漏洞常見於經過 URL 傳遞參數的功能,如網站搜索、跳轉等。因爲須要用戶主動打開惡意的 URL 才能生效,攻擊者每每會結合多種手段誘導用戶點擊。
DOM 型 XSS 的攻擊步驟:
DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其餘兩種 XSS 都屬於服務端的安全漏洞。