XSRF
原理
用戶(hù)登錄,網(wǎng)站A核查身份是否正確,正確就下發(fā)cookie
cookie會(huì)保存在用戶(hù)的瀏覽器中,這就完車(chē)了一次身份認(rèn)證的過(guò)程
接下來(lái)呢,用戶(hù)又訪問(wèn)了一個(gè)網(wǎng)站B,網(wǎng)站B在給用戶(hù)返回頁(yè)面的時(shí)候,會(huì)攜帶一個(gè)引誘性的點(diǎn)擊,這個(gè)點(diǎn)擊往往是一個(gè)鏈接,這個(gè)鏈接一般就是網(wǎng)站A的API接口。當(dāng)用戶(hù)點(diǎn)擊了這個(gè)鏈接后,這個(gè)點(diǎn)擊就訪問(wèn)了A網(wǎng)站,當(dāng)我們?cè)L問(wèn)A網(wǎng)站的時(shí)候咱們都知道瀏覽器會(huì)自動(dòng)上傳cookie,這個(gè)時(shí)候網(wǎng)站A覺(jué)得這個(gè)cookie拿到了,對(duì)身份進(jìn)行了重新確認(rèn),身份沒(méi)有問(wèn)題就相當(dāng)于執(zhí)行了這個(gè)接口的動(dòng)作。
新浪微博就出現(xiàn)過(guò)這樣的CSRF攻擊,莫名的增加了很多粉絲,就是這個(gè)原因。
這里有個(gè)前提就是注冊(cè)用戶(hù)在被攻擊網(wǎng)站一定登錄過(guò),未登錄的話(huà)訪問(wèn)權(quán)限接口提要求它登錄的。
CRSF造成攻擊的兩個(gè)前提,第一:網(wǎng)站中某個(gè)接口存在漏洞;第二:用戶(hù)在這個(gè)網(wǎng)站一定登陸過(guò),這是實(shí)現(xiàn)CSRF攻擊的兩個(gè)基本前提。
攻擊
你登錄了一個(gè)購(gòu)物網(wǎng)站,正在瀏覽商品,然后下單支付比如支付API是http://xxx.com/pay?id=100但是沒(méi)有任何驗(yàn)證。此時(shí)你收到一封郵件,郵件中隱藏著<img src='http://xxx.com/pay?id=100'/>,咱們都知道img一加載就會(huì)立即執(zhí)行,你查看郵件的就已經(jīng)悄悄的支付了
防御
-
token驗(yàn)證:
我們的驗(yàn)證方式是自動(dòng)cookie,沒(méi)有手動(dòng)的token,token是注冊(cè)成功以后,是服務(wù)器給我們返回的。在我們?cè)L問(wèn)一些權(quán)限接口的時(shí)候必須攜帶token,否則不能通過(guò)認(rèn)證。就比如我們剛剛講的圖,點(diǎn)擊引誘連接只會(huì)自動(dòng)攜帶cookie不會(huì)攜帶token,所以就能避免攻擊。 - referer驗(yàn)證:指的就是頁(yè)面來(lái)源,服務(wù)器判斷這個(gè)頁(yè)面是不是我下面的頁(yè)面,如果是我就執(zhí)行你的動(dòng)作,如果不是就不執(zhí)行一律攔截。
- 隱藏令牌: 和token比較像,我們可能會(huì)把令牌放在請(qǐng)求頭中,不會(huì)放在鏈接上,這兩個(gè)本質(zhì)上沒(méi)什么太大的區(qū)別。只是使用方式有一點(diǎn)差別
XSRF VS XSS
- XSS是像你的頁(yè)面注入JS腳本執(zhí)行,在JS里面去做他想做的事情;無(wú)需做權(quán)限認(rèn)證;
- XSRF是用你API本身的漏洞,幫你自動(dòng)執(zhí)行;需要登錄認(rèn)證;