CSRF跨站請求偽造介紹和防禦方法
跨站請求偽造(CSRF)
概念
CSRF,全稱為Cross-Site Request Forgery,跨站請求偽造,是一種網路攻擊方式,它可以在使用者毫不知情的情況下,以使用者的名義偽造請求傳送給被攻擊站點,從而在未授權的情況下進行許可權保護內的操作。
具體來講,可以這樣理解CSRF。攻擊者借用使用者的名義,向某一伺服器傳送惡意請求,對伺服器來講,這一請求是完全合法的,但攻擊者確完成了一個惡意操作,比如以使用者的名義傳送郵件,盜取賬號,購買商品等等。
原理
CSRF攻擊原理比較簡單,例如Web A為存在CSRF漏洞的網站,Web B為攻擊者構建的惡意網站,User C為Web A網站的合法使用者。
- 使用者C開啟瀏覽器,訪問受信任網站A,輸入使用者名稱和密碼請求登入網站A;
- 在使用者資訊通過驗證後,網站A產生Cookie資訊並返回給瀏覽器,此時使用者登入網站A成功,可以正常傳送請求到網站A;並且,此後從使用者瀏覽器傳送請求給網站A時都會預設帶上使用者的Cookie資訊;
- 使用者未退出網站A之前,在同一瀏覽器中,開啟一個TAB頁訪問網站B;
- 網站B接收到使用者請求後,返回一些攻擊性程式碼,併發出一個請求要求訪問第三方站點A;
- 瀏覽器在接收到這些攻擊性程式碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie資訊,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據使用者C的Cookie資訊以C的許可權處理該請求,導致來自網站B的惡意程式碼被執行。
簡單來說,CSRF必須經過兩個步驟:
1、使用者訪問可信任站點A,併產生了相關的cookie;
2、使用者在訪問A站點時沒有退出,同時訪問了危險站點B。 疑問:為什麼網站A不能退出呢?
解決方法
伺服器端表單hash認證
在所有的表單裡面隨機生成一個hash,server在表單處理時去驗證這個hash值是否正確,這樣工作量比較大。
驗證http Referer欄位
根據HTTP協議,HTTP頭中的欄位Referer記錄了HTTP請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。比如某銀行的轉賬是通過使用者訪問http://bank.test/test?page=10&userID=101&money=10000
在HTTP頭中自定義屬性並驗證
自定義屬性的方法也是使用token並進行驗證,和前一種方法不同的是,這裡並不是把token以引數的形式置於HTTP請求之中,而是把它放到HTTP頭中自定義的屬性裡。通過XMLHttpRequest這個類,可以一次性給所有該類請求加上csrftoken這個HTTP頭屬性,並把token值放入其中。這樣解決了前一種方法在請求中加入token的不便,同時,通過這個類請求的地址不會被記錄到瀏覽器的位址列,也不用擔心token會通過Referer洩露到其他網站。
--------------------- 本文來自 JiajiaAz 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_32657025/article/details/79476452?utm_source=copy