我在页面上有多个表单,全部使用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