django - csrfmiddlewaretoken 和 csrftoken 是什么关系?

标签 django csrf

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

当我测试网站时:

GET / HTTP/1.1
Host: 123.207.137.168:8000

然后,我得到了 cookies
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是不同的,如果请求来自用户或黑客,服务器如何使用这两个值来验证?

最佳答案

docs里有一些答案,但是 looking at the code真正解开这个“谜”
基本上 django 的作用如下:

  • 制作 CSRF key
  • 向其中添加随机盐并将加盐结果设置为 CSRF cookie ( csrftoken )
  • 当用户打开一个表单/请求/任何东西时,检查用户是否设置了 CSRF cookie(如果他们没有,按照上面的方法制作)。如果他们拥有它,取出它,去除盐并获得真正的 secret ,添加随机盐并将其用作另一个 token ( csrfmiddlewaretoken )。

  • 例如,现在当您发出 POST 请求时,会发生以下情况
  • 您发送 csrfmiddlewaretoken
  • Django 对 csrf cookie ( csrftoken )
  • 脱盐
  • Django 对您发送的 token 取消加盐 ( csrfmiddlewaretoken )
  • Django 比较了它们。如果两者匹配,你就可以了。

  • 这个带有两个 token 的方法被称为 双重提交 Cookie . Django 的加盐方式允许将相同的 csrf 保密一段时间,而不必为每个请求更新 key

    关于django - csrfmiddlewaretoken 和 csrftoken 是什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48002861/

    相关文章:

    javascript - 在 django 中向 TinyMCE 添加外部插件

    升级 1.9 > 1.11 后 Django CSRF 失败

    node.js - Express 的 CSRF token 问题

    python - Django csrf token 丢失或不正确错误 403

    python - Django 抽象模型设置带有下划线的 related_name

    django rest 框架 jwt 身份验证与电子邮件和密码

    node.js - "Invalid csrf token"在nodejs(Express)中使用CSURF。CSRF token 对于第一个请求工作正常,但对于所有其他请求给出错误

    ruby-on-rails - rails : How Does csrf_meta_tag Work?

    python - Django 联系表单类型错误 : context must be a dict rather than Context

    javascript - 如何将复选框设置为带有确认消息的按钮?