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