2014-02-27 79 views
1

我在頁面上有多個表單,全部使用CSRF標記模板標記{%csrf_token%}使用Angular $ http發佈表單。使用javascript更新CSRF表單輸入輸入

所有表單都具有相同的CSRF標記,因此當我發佈一個表單時會使其他表單失效。

有沒有一種方式,當我發佈表單時,我從服務器上獲得一個新的CSRF令牌,我可以使用它來更新表單。

我嘗試使用$ http headers()從響應頭獲取新的CSRF令牌,但它不可用。

+2

的CSRF中間件不使用時無效令牌訪問。 CSRF令牌僅在新登錄時更改;只要同一用戶登錄,它就保持不變。您的問題不是由CSRF令牌失效引起的,除非您發佈的表單實際執行登錄。 – lanzz

+1

更詳細的一點,我在同一頁上有一個註冊表和登錄表單,兩個表示都有一個標記CZQOkC6LUEOixqFYzDiZYlTyY89KoFII。我可以註冊爲一個用戶罰款,但是如果我嘗試在同一頁面上登錄(不刷新),我得到一個403禁止的「CSRF令牌丟失或不正確」? – sidarcy

回答

2

保存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; 
+0

+1角餅乾建議,但是,雖然csrftoken在請求中,我沒有看到它在$餅乾(我看到所有其他餅乾)任何建議 – sidarcy

+0

你可以檢查,如果你看到'csrftoken'在原始的'document.cookie'字符串? Angular可能會提供過時的數據,但瀏覽器cookie存儲應該已隨您的AJAX響應收到的新CSRF令牌更新。 – lanzz

+0

csrf也是從document.cookie中丟失的,我應該提到這個:(關於如何獲得新的csrf標記(從AJAX響應中接收到的)的任何想法我嘗試了$ header但沒有運氣 – sidarcy

1

一個黑客的有點,但是這是我落得這樣做:

在我的迴應,我明確地設置新的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;