我在頁面上有多個表單,全部使用CSRF標記模板標記{%csrf_token%}使用Angular $ http發佈表單。使用javascript更新CSRF表單輸入輸入
所有表單都具有相同的CSRF標記,因此當我發佈一個表單時會使其他表單失效。
有沒有一種方式,當我發佈表單時,我從服務器上獲得一個新的CSRF令牌,我可以使用它來更新表單。
我嘗試使用$ http headers()從響應頭獲取新的CSRF令牌,但它不可用。
我在頁面上有多個表單,全部使用CSRF標記模板標記{%csrf_token%}使用Angular $ http發佈表單。使用javascript更新CSRF表單輸入輸入
所有表單都具有相同的CSRF標記,因此當我發佈一個表單時會使其他表單失效。
有沒有一種方式,當我發佈表單時,我從服務器上獲得一個新的CSRF令牌,我可以使用它來更新表單。
我嘗試使用$ http headers()從響應頭獲取新的CSRF令牌,但它不可用。
保存CSRF令牌的瀏覽器cookie應在您的登錄請求後更新。你應該能夠得到從csrftoken
cookie中的新標記時,如表現出CSRF documentation:
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
你也應該能夠跳過大多數這個樣板,只使用the AngularJS $cookies API:
var csrftoken = $cookie.csrftoken;
一個黑客的有點,但是這是我落得這樣做:
在我的迴應,我明確地設置新的CSRF令牌值
response['new_csrf'] = self.request.META['CSRF_COOKIE']
return response
然後可以在客戶端上採用了棱角分明$頭()
var new_csrf = headers()['new_csrf']
然後我更新$ HHTP後頭部
$http.defaults.headers.post['X-CSRFToken'] = new_csrf;
的CSRF中間件不使用時無效令牌訪問。 CSRF令牌僅在新登錄時更改;只要同一用戶登錄,它就保持不變。您的問題不是由CSRF令牌失效引起的,除非您發佈的表單實際執行登錄。 – lanzz
更詳細的一點,我在同一頁上有一個註冊表和登錄表單,兩個表示都有一個標記CZQOkC6LUEOixqFYzDiZYlTyY89KoFII。我可以註冊爲一個用戶罰款,但是如果我嘗試在同一頁面上登錄(不刷新),我得到一個403禁止的「CSRF令牌丟失或不正確」? – sidarcy