圖中 Browse 是瀏覽器,WebServerA 是受信任網(wǎng)站/被攻擊網(wǎng)站 A,WebServerB 是惡意網(wǎng)站/點(diǎn)擊網(wǎng)站 B。
(1)一開(kāi)始用戶打開(kāi)瀏覽器,訪問(wèn)受信任網(wǎng)站 A,輸入用戶名和密碼登陸請(qǐng)求登陸網(wǎng)站 A。
(2)網(wǎng)站 A 驗(yàn)證用戶信息,用戶信息通過(guò)驗(yàn)證后,網(wǎng)站 A 產(chǎn)生 Cookie 信息并返回給瀏覽器。
(3)用戶登陸網(wǎng)站 A 成功后,可以正常請(qǐng)求網(wǎng)站 A。
(4)用戶未退出網(wǎng)站 A 之前,在同一瀏覽器中,打開(kāi)一個(gè) TAB 訪問(wèn)網(wǎng)站 B。
(5)網(wǎng)站 B 看到有人方式后,他會(huì)返回一些攻擊性代碼。
(6)瀏覽器在接受到這些攻擊性代碼后,促使用戶不知情的情況下瀏覽器攜帶 Cookie(包括 sessionId)信息,請(qǐng)求網(wǎng)站 A。這種請(qǐng)求有可能更新密碼,添加用戶什么的操作。
從上面 CSRF 攻擊原理可以看出,要完成一次 CSRF 攻擊,需要被攻擊者完成兩個(gè)步驟:
(1) 登陸受信任網(wǎng)站 A,并在本地生成 COOKIE。
(2) 在不登出 A 的情況下,訪問(wèn)危險(xiǎn)網(wǎng)站 B。
如果不滿足以上兩個(gè)條件中的一個(gè),就不會(huì)受到 CSRF 的攻擊,以下情況可能會(huì)導(dǎo)致 CSRF:
(1) 登錄了一個(gè)網(wǎng)站后,打開(kāi)一個(gè) tab 頁(yè)面并訪問(wèn)另外的網(wǎng)站。
(2) 關(guān)閉瀏覽器了后,本地的 Cookie 尚未過(guò)期,你上次的會(huì)話還沒(méi)有已經(jīng)結(jié)束。(事實(shí)上,關(guān)閉瀏覽器不能結(jié)束一個(gè)會(huì)話,但大多數(shù)人都會(huì)錯(cuò)誤的認(rèn)為關(guān)閉瀏覽器就等于退出登錄/結(jié)束會(huì)話了……)
解決辦法:就是在表單中添加 from.csrf_token。