What's the relationship between csrfmiddlewaretoken and csrftoken?

Xuy*_*Bai 5 django csrf

I was working with Django to create a website and got some questions about CSRF. I use django.middleware.csrf.CsrfViewMiddleware and add <form action="" method="post">{% csrf_token %} in my POST form.

And when I test the website:

GET / HTTP/1.1
Host: 123.207.137.168:8000
Run Code Online (Sandbox Code Playgroud)

Then, I got cookies

Set-Cookie:csrftoken=Ev8veOH89vFDnG3a0GJUsMXA1oGZXxqXRw2nFWiKrvZ9UE10niTlZCiOxdnoKfTv; expires=Thu, 27-Dec-2018 06:37:41 GMT; Max-Age=31449600; Path=/
Run Code Online (Sandbox Code Playgroud)

But in the html:

<input type='hidden' name='csrfmiddlewaretoken' value='JswHLk4fNpxHkh0OObD1uKiOxSDUzkMDWtqzcsFR5pRdRfYEbNNs1AD23Hkjm2fb' />
Run Code Online (Sandbox Code Playgroud)

So I was wondering why the csrftoken and csrfmiddlewaretoken is different and how did the server use these two value to valid if the request is from the users or hackers?


Joh*_*los 11

文档中有一些答案,但是查看代码确实解决了这个“谜团” 基本上 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 保密一段时间,而不必为每个请求更新密钥