可能重复:
"CSRF token missing or incorrect" while post parameter via AJAX in Django
我想通过AJAX发送登录数据来验证用户身份,但由于CSRF,这是不可能的。你能告诉我在我的代码中添加什么来让它变得更好吗?
我的JavaScript文件:
$("#login").live("click", function() {
var username = $(".login_username").val();
var password = $(".login_password").val();
$.ajax({
url: "/login",
type: "POST",
data: {
username: username,
password: password
},
cache: false,
success: function(tekst) {
alert(tekst);
}
});
});
答案 0 :(得分:10)
它包括在每个ajax请求上添加一个X-CSRFToken标头。
这是通过挂钩jQuery.ajaxSend事件来完成的,所以一切都是自动完成的(你只需要复制并经过他们的代码,并在你发出第一个ajax请求之前运行一次)。
答案 1 :(得分:3)
我一直在尝试解决同样的问题,并且正如arnaud576875所说,你必须在每个ajax请求上添加csrf标记头,就像Django文档说https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax并在任何Ajax请求之前执行该代码使
但还有一些额外的东西,你必须找到一种方法在尝试执行任何AJAX请求之前将csrf令牌加载到应用程序的cookie中,经过大量痛苦的研究后我找不到具体的答案如何做到这一点,我所做的是确保你的视图在cookie中发送csrf令牌,你可以使用ensure_csrf_token()
到每个你想要接收令牌https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie的视图这似乎工作很多人,但没有为我工作。
另一种方法是使用旧版方法,将 'django.middleware.csrf.CsrfResponseMiddleware'
添加到MIDDLEWARE_CLASSES
,但我不建议使用此方法,因为会留下一些安全风险。
https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method
我之前说过的所有这些方法对我都不起作用。我允许Ajax执行某些请求的方式如下,如果有人发现这是一种危险的方法,请告诉我:
request.META["CSRF_COOKIE_USED"] = True
就是这样,这就是对我有用的方式,但正如我之前所说,我不确定这是否是正确的方法或最安全的方法来完成csrf保护。