【问题标题】:What's the relationship between csrfmiddlewaretoken and csrftoken?csrfmiddlewaretoken 和 csrftoken 是什么关系?
【发布时间】:2018-06-08 17:29:59
【问题描述】:

我正在与 Django 合作创建一个网站,并收到了一些关于 CSRF 的问题。我使用django.middleware.csrf.CsrfViewMiddleware 并在我的POST 表单中添加<form action="" method="post">{% csrf_token %}

当我测试网站时:

GET / HTTP/1.1
Host: 123.207.137.168:8000

然后,我得到了饼干

Set-Cookie:csrftoken=Ev8veOH89vFDnG3a0GJUsMXA1oGZXxqXRw2nFWiKrvZ9UE10niTlZCiOxdnoKfTv; expires=Thu, 27-Dec-2018 06:37:41 GMT; Max-Age=31449600; Path=/

但是在html中:

<input type='hidden' name='csrfmiddlewaretoken' value='JswHLk4fNpxHkh0OObD1uKiOxSDUzkMDWtqzcsFR5pRdRfYEbNNs1AD23Hkjm2fb' />

所以我想知道为什么csrftokencsrfmiddlewaretoken 不同,如果请求来自用户或黑客,服务器如何使用这两个值来验证?


【问题讨论】:

    标签: django csrf


    【解决方案1】:

    docs里有一些答案,但looking at the code确实解开了这个“谜团” 基本上django所做的如下:

    1. 制作 CSRF 密钥
    2. 向其中添加随机盐并将加盐结果设置为 CSRF cookie (csrftoken)
    3. 当用户打开表单/请求/任何内容时,检查用户是否设置了 CSRF cookie(如果没有,请按上述方法制作)。如果他们有,请获取它,剥离盐并获取真正的秘密,添加随机盐并将其用作另一个令牌 (csrfmiddlewaretoken)。

    现在,例如,当您发出 POST 请求时,会发生以下情况

    1. 您发送 csrfmiddlewaretoken
    2. Django 将 csrf cookie 解盐 (csrftoken)
    3. Django 对您发送的令牌取消加盐 (csrfmiddlewaretoken)
    4. Django 比较它们。如果两者匹配,就可以了。

    这种带有两个标记的方法称为Double-Submit Cookie。 Django 的加盐方式允许在一段时间内保持相同的 csrf 机密,而无需为每个请求更新密钥

    【讨论】:

    • 这是我一直在寻找的好答案。
    • 谢谢,你说得这么清楚易懂! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2013-06-14
    • 2018-02-16
    • 2020-05-04
    • 2020-01-08
    • 2015-01-13
    相关资源
    最近更新 更多