跨站請求偽造(CSRF)
跨站請求偽造(CSRF)
概念
CSRF,全稱為Cross-Site Request Forgery,跨站請求偽造,是一種網路攻擊方式,它可以在使用者毫不知情的情況下,以使用者的名義偽造請求傳送給被攻擊站點,從而在未授權的情況下進行許可權保護內的操作。
具體來講,可以這樣理解CSRF。攻擊者借用使用者的名義,向某一伺服器傳送惡意請求,對伺服器來講,這一請求是完全合法的,但攻擊者確完成了一個惡意操作,比如以使用者的名義傳送郵件,盜取賬號,購買商品等等。
原理
CSRF攻擊原理比較簡單,例如Web A為存在CSRF漏洞的網站,Web B為攻擊者構建的惡意網站,User C為Web A網站的合法使用者。
簡單來說,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洩露到其他網站。