跨站請求偽造(CSRF)解決方案
阿新 • • 發佈:2018-12-11
(1)驗證HTTP Referer欄位
根據HTTP協議,在HTTP頭中有一個欄位叫Referer,它記錄了該HTTP請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。
比如某銀行的轉賬是通過使用者訪問http://bank.com/XX?XX=xx&XX=xx頁面完成,使用者必須先登入bank.com,然後通過點選頁面上的按鈕來觸發轉賬事件。當用戶提交請求時,該轉賬請求的Referer值就會是轉賬按鈕所在頁面的URL(本例中,通常是以bank.com域名開頭的地址)。而如果攻擊者要對銀行網站實施CSRF攻擊,他只能在自己的網站構造請求,當用戶通過攻擊者的網站傳送請求到銀行時,該請求的Referer是指向攻擊者的網站。
因此,要防禦CSRF攻擊,銀行網站只需要對於每一個轉賬請求驗證其Referer值,如果是以bank.com開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果Referer是其他網站的話,就有可能是CSRF攻擊,則拒絕該請求。
(2)在請求地址中新增token並驗證
CSRF攻擊之所以能夠成功,是因為攻擊者可以偽造使用者的請求,該請求中所有的使用者驗證資訊都存在於Cookie中,因此攻擊者可以在不知道這些驗證資訊的情況下直接利用使用者自己的Cookie來通過安全驗證。
由此可知,抵禦CSRF攻擊的關鍵在於:在請求中放入攻擊者所不能偽造的資訊,並且該資訊不存在於Cookie之中。
鑑於此,系統開發者可以在HTTP請求中以引數的形式加入一個隨機產生的token,並在伺服器端建立一個攔截器來驗證這個token,如果請求中沒有token或者token內容不正確,則認為可能是CSRF攻擊而拒絕該請求。