定義:
后果
比如黑客可以通過惡意代碼,拿到用戶的cookie就可以去登陸了
分類
存儲型
攻擊者把惡意腳本存儲在目標網站的數據庫中(沒有過濾直接保存),當用戶訪問這個頁面時,惡意腳本會從數據庫中被讀取并在用戶瀏覽器中執行。比如在那些允許用戶評論的網站, 用戶越多,中招的越多
流程
反射型
攻擊者通過構造惡意鏈接,誘使用戶點擊,惡意腳本隨請求發送到目標網站服務器,服務器查看了鏈接以后以為用戶要檢索某些信息,并沒有進行額外的過濾,服務器的數據庫也不需要保存什么信息,就只是返回了對應的結果,瀏覽器只是把結果呈現在頁面.
例子
反射型一般是利用網頁的檢索功能, 你輸入的檢索信息會顯示在頁面中
如果url加一個script標簽, 也就注入網頁成為內容的一部分,瀏覽器就會去執行這個js代碼
DOM型
攻擊者在url中插入惡意代碼,前端直接從url中獲取惡意代碼并且輸出到頁面,導致惡碼被執行, 跟反射型很像,但瀏覽器并未把惡意代碼發送給服務器, 是前端直接執行的. 比如url中的hash部分是不會發送給服務器的,即url前面的部分服務器照常請求,也就是瀏覽器的渲染分了兩步走,給黑客留下可以攻擊的漏洞
“#”部分的更改不會重新發送請求, 此頁面將hash注入到了頁面,黑客就可以利用這個點往頁面注入內容, 比如獲取cookie等
也就是前端在處理用戶輸入時未正確驗證、過濾或轉義,導致惡意輸入被解釋為代碼并執行 . 解決辦法: 避免使用innerHTML、document.write, v-html、dangerouslySetInnerHTML 把不可信的數據作為 HTML 插到頁面上,而應盡量使用 textContent、setAttribute() 等。
三者區別
DOM 型取出和執?惡意代碼由瀏覽器端完成,不涉及將惡意腳本發送到服務器,屬于前端JavaScript 自身的安全漏洞,而其他兩種屬于服務端的安全漏洞。
應對策略
對用戶輸入進行嚴格的驗證和過濾
前端驗證
- 通過h5表單屬性,如pattern正則表達式模式,type字段的屬性進行限制等;
- js中的動態驗證: 通過對輸入添加addevenlistener監聽
服務端驗證
無論客戶端是否驗證,都必須在服務器端再次驗證輸入。
可以使用后端語言的內置函數或正則表達式進行驗證。
輸入過濾
- 用戶輸入顯示在網頁上之前,將其中的特殊字符(如 <, >, &, ', ")轉義,防止其被解釋為腳本, 防止 XSS 攻擊。
- URL 編碼: 將 URL 中的特殊字符轉換為 % 加上兩位十六進制數的形式,以確保 URL 安全傳輸。
let userInput = 'hello world';
let encodedInput = encodeURIComponent(userInput);
console.log(encodedInput); // hello%20world
限制用戶輸入的長度
防止緩沖區溢出和資源濫用。
CSP
使用 CSP內容安全策略, HTTP 響應頭設Content-Security-Policy,本質是建立一個白名單,告訴瀏覽器哪些外部資源可以加載和執行,從而防止惡意代碼的注入攻擊。
http-only
黑客本質是想獲取cookie拿到客人信息, 而Cookie有一個http-only屬性,表示只能被http請求攜帶,不能通過客戶端js腳本訪問cookie,