当我将包含CSRF令牌的Ajax请求发送到无效的URL,然后在随后的任何请求中跟进它时,第一个Ajax请求的主体数据将被添加到下一个请求,从而使该请求无效。如果第二个请求来自新的浏览器窗口,则“无效的CSRF”页面将被返回,即使这是第一次从新窗口中打开网站的主页。
假设以下请求有效,则可以对其进行正确处理。
每当将带有csrf令牌标头的请求发送到无效的URL时,都会发生此问题。
除了完全删除CSRF之外,不确定如何解决此问题。
Django 2.1.4 Python 3.7
我开始了一个项目,并以最少的代码重现了该错误。我认为这绝对是CSRF代码中的错误。这是整个项目:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Test worked
<script
src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
<script>
var token = "{{csrf_token}}";
var conf = {
type: "POST",
url: "bad",
data: {title: "Title Here"},
headers: {
"X-CSRFToken": token
}
}
function badSubmit() {
$.ajax(conf);
};
</script>
</body>
</html>
运行该页面后,无论来自哪里,对服务器的下一个get请求都将中断。服务器日志将输出没有意义的行:
[03/Aug/2019 15:02:56] "title=Title+HereGET / HTTP/1.1" 403 2513
我的观点只是为了说服您,这不是我的代码引起问题:
from django.shortcuts import render
def test_view(request):
return render(request, "test.html", {})
如果启动页面,请在开发控制台中运行badSubmit(),则发送到服务器的NEXT请求将被Django服务器错误地处理,无论下一个请求是什么。如果我错了,请更正我,但这是当发送CSRF令牌时CSRF中间件损坏或Django服务器损坏的确定证据。不包含CSRF令牌标头时,不会发生该错误。一切的默认django设置。