XSS
cross site script,跨站腳本攻擊(關(guān)鍵字:腳本)。為了與 css 沖突取名為 xss!
XSS攻擊的核心原理是:不需要你做任何的登錄認(rèn)證,它會(huì)通過(guò)合法的操作(比如在url中輸入、在評(píng)論框中輸入),向你的頁(yè)面注入腳本(可能是js、hmtl代碼塊等)。
惡意攻擊者往Web頁(yè)面里插入惡意Script代碼,當(dāng)用戶(hù)瀏覽該頁(yè)之時(shí),嵌入其中Web里面的Script代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶(hù)的目的。
最后導(dǎo)致的結(jié)果可能是:
盜用Cookie
破壞頁(yè)面的正常結(jié)構(gòu),插入廣告等惡意內(nèi)容
D-doss攻擊
XSS的攻擊方式
1、反射型(臨時(shí),非持久型)
發(fā)出請(qǐng)求時(shí),XSS代碼出現(xiàn)在url中,作為輸入提交到服務(wù)器端,服務(wù)器端解析后響應(yīng),XSS代碼隨響應(yīng)內(nèi)容一起傳回給瀏覽器,最后瀏覽器解析執(zhí)行XSS代碼。這個(gè)過(guò)程像一次反射,所以叫反射型XSS。
客戶(hù)端提交,服務(wù)器解析后響應(yīng),到客戶(hù)端再執(zhí)行
2、存儲(chǔ)型(持久型)
存儲(chǔ)型XSS和反射型XSS的差別在于,提交的代碼會(huì)存儲(chǔ)在服務(wù)器端(數(shù)據(jù)庫(kù)、內(nèi)存、文件系統(tǒng)等)。
比如先通過(guò)對(duì)一個(gè)攻擊url進(jìn)行編碼(來(lái)繞過(guò)xss filter),然后提交該web server(存儲(chǔ)在web server中), 然后用戶(hù)在瀏覽頁(yè)面時(shí),如果點(diǎn)擊該url,就會(huì)觸發(fā)一個(gè)XSS攻擊。當(dāng)然用戶(hù)點(diǎn)擊該url時(shí),也可能會(huì)觸發(fā)一個(gè)CSRF(Cross site request forgery)攻擊。
以上兩種服務(wù)端參與
3、DOM based XSS
基于DOM的XSS,也就是web server不參與,僅僅涉及到瀏覽器的XSS。比如根據(jù)用戶(hù)的輸入來(lái)動(dòng)態(tài)構(gòu)造一個(gè)DOM節(jié)點(diǎn),如果沒(méi)有對(duì)用戶(hù)的輸入進(jìn)行過(guò)濾,那么也就導(dǎo)致XSS攻擊的產(chǎn)生。過(guò)濾可以考慮采用esapi4js。
預(yù)防:
簡(jiǎn)而言之:轉(zhuǎn)義+過(guò)濾(** 輸入過(guò)濾,輸出轉(zhuǎn)義 **)
1、在cookie中設(shè)置了HttpOnly屬性,那么通過(guò)js腳本將無(wú)法讀取到cookie信息,這樣能有效的防止XSS攻擊
過(guò)濾:
移除用戶(hù)輸入的和事件相關(guān)的屬性。如onerror可以自動(dòng)觸發(fā)攻擊,還有onclick等。(總而言是,過(guò)濾掉一些不安全的內(nèi)容)
移除用戶(hù)輸入的Style節(jié)點(diǎn)、Script節(jié)點(diǎn)、Iframe節(jié)點(diǎn)。(尤其是Script節(jié)點(diǎn),它可是支持跨域的呀,一定要移除)。
CSRF
用戶(hù)登錄A網(wǎng)站產(chǎn)生cookie,此時(shí)再訪問(wèn)B(危險(xiǎn)),B要求訪問(wèn)A,并發(fā)起一個(gè)請(qǐng)求
此時(shí),B(危險(xiǎn))就利用用戶(hù)的權(quán)限在A進(jìn)行了操作。

如何預(yù)防:
1、Token 驗(yàn)證:(用的最多)
(1)服務(wù)器發(fā)送給客戶(hù)端一個(gè)token;
(2)客戶(hù)端提交的表單中帶著這個(gè)token。
(3)如果這個(gè) token 不合法,那么服務(wù)器拒絕這個(gè)請(qǐng)求。
2、隱藏令牌:
把 token 隱藏在 http 的 head頭中。
響應(yīng)頭

請(qǐng)求頭

ps:方法二和方法一有點(diǎn)像,本質(zhì)上沒(méi)有太大區(qū)別,只是使用方式上有區(qū)別。
CSRF 和 XSS 的區(qū)別
面試官還可能喜歡問(wèn)二者的區(qū)別。
區(qū)別一:
CSRF:需要用戶(hù)先登錄網(wǎng)站A,獲取 cookie。
XSS:不需要登錄。
區(qū)別二:(原理的區(qū)別)
CSRF:是利用網(wǎng)站A本身的漏洞,去請(qǐng)求網(wǎng)站A的api。
XSS:是向網(wǎng)站 A 注入 JS代碼,然后執(zhí)行 JS 里的代碼,篡改網(wǎng)站A的內(nèi)容。