目的是防禦CSRF攻擊。
Token就是令牌,最大的特點就是隨機性,不可預測。
CSRF 攻擊之所以能夠成功,是因為黑客可以完全偽造使用者的請求,該請求中所有的使用者驗證資訊都是存在於 cookie 中,因此黑客可以在不知道這些驗證資訊的情況下直接利用使用者自己的 cookie 來通過安全驗證。要抵禦 CSRF,關鍵在於在請求中放入黑客所不能偽造的資訊,並且該資訊不存在於 cookie 之中。可以在 HTTP 請求中以引數的形式加入一個隨機產生的 token,並在伺服器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。
這種方法要比檢查 Referer 要安全一些,token 可以在使用者登陸後產生並放於 session 之中,然後在每次請求時把 token 從 session 中拿出,與請求中的 token 進行比對,但這種方法的難點在於如何把 token 以引數的形式加入請求。對於 GET 請求,token 將附在請求地址之後,這樣 URL 就變成 http://url?csrftoken=tokenvalue。 而對於 POST 請求來說,要在 form 的最後加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,這樣就把 token 以引數的形式加入請求了。
如果說這個Token是指的使用者登入的憑據,並用以維持登入狀態的話,也就是說一個使用者必須要輸入使用者名稱密碼並驗證通過後,伺服器才會分配一個Token,傳回並儲存在客戶端作為憑證(同時儲存在伺服器上)。因此並不是每個人都可以獲得這個Token,只有能提供正確使用者密碼的客戶端才可以。
之後每一次操作,都需要客戶端向伺服器提供這個Token,以驗證登入狀態,如果考慮安全性的話,還可以增加對User-Agent、IP等資訊的驗證。
CSRF防範方法:
(1)驗證碼
(2)refer頭
(3)Token
說明:理解token的作用,他是一個隨機的值,是伺服器端前一個請求給的,是一次性的,可以防止csrf這種惡意的攜帶自己站點的資訊發請求或者提交資料(這個動作一般需要獲取你的前一個請求的響應返回的token值,加大了難度,並不能完全杜絕)。
注意當然不能寫到cookie中,因為瀏覽器在發出惡意csrf請求時,是自動帶著你的cookie的。