Django CSRF导致服务器在错误的URL请求后出错

时间:2019-08-03 15:19:09

标签: python django csrf middleware

当我将包含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设置。

0 个答案:

没有答案