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