通常XSS攻擊分為:反射型xss攻擊, 存儲型xss攻擊 和 DOM型xss攻擊。同時注意以下例子只是簡單的向你解釋這三種類型的攻擊方式而已,實際情況比這個復雜,具體可以再結合最后一節深入理解。
反射型xss攻擊?
反射型的攻擊需要用戶主動的去訪問帶攻擊的鏈接,攻擊者可以通過郵件或者短信的形式,誘導受害者點開鏈接。如果攻擊者配合短鏈接URL,攻擊成功的概率會更高。
在一個反射型XSS攻擊中,惡意文本屬于受害者發送給網站的請求中的一部分。隨后網站又把惡意文本包含進用于響應用戶的返回頁面中,發還給用戶。
存儲型xss攻擊?
這種攻擊方式惡意代碼會被存儲在數據庫中,其他用戶在正常訪問的情況下,也有會被攻擊,影響的范圍比較大。
DOM型xss攻擊?
基于DOM的XSS攻擊是反射型攻擊的變種。服務器返回的頁面是正常的,只是我們在頁面執行js的過程中,會把攻擊代碼植入到頁面中。
XSS 攻擊的防御?
XSS攻擊其實就是代碼的注入。用戶的輸入被編譯成惡意的程序代碼。所以,為了防范這一類代碼的注入,需要確保用戶輸入的安全性。對于攻擊驗證,我們可以采用以下兩種措施:
1. 編碼,就是轉義用戶的輸入,把用戶的輸入解讀為數據而不是代碼
2. 校驗,對用戶的輸入及請求都進行過濾檢查,如對特殊字符進行過濾,設置輸入域的匹配規則等。
具體比如:
1. 對于驗證輸入,我們既可以在服務端驗證,也可以在客戶端驗證
2. 對于持久性和反射型攻擊,服務端驗證是必須的,服務端支持的任何語言都能夠做到
3. 對于基于DOM的XSS攻擊,驗證輸入在客戶端必須執行,因為從服務端來說,所有發出的頁面內容是正常的,只是在客戶端js代碼執行的過程中才發生可攻擊
4. 但是對于各種攻擊方式,我們最好做到客戶端和服務端都進行處理。
其它還有一些輔助措施,比如:
1. 入參長度限制: 通過以上的案例我們不難發現xss攻擊要能達成往往需要較長的字符串,因此對于一些可以預期的輸入可以通過限制長度強制截斷來進行防御。
2. 設置cookie httponly為true。