【问题标题】:Where is the csrftoken stored in Django database?csrftoken 存储在 Django 数据库中的什么位置?
【发布时间】:2018-03-15 11:26:49
【问题描述】:

csrftoken 存储在哪里?

当我访问一个 API 端点时(注销 API,它不需要参数):

POST /rest-auth/logout/ HTTP/1.1
Host: 10.10.10.105:8001
Connection: keep-alive
Content-Length: 0
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
Authorization: Token 0fe2977498e51ed12ddc93026b08ab0b1a06a434
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36
Referer: http://localhost:8080/register
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: sessionid=b95zopro0qvkrexj8kq6mzo1d3z2hvbl; csrftoken=z53lKL0f7VHkilYS5Ax8FMaQCU2ceouje9OeTJOgTy4gH0UgHVltAlOe2KFNNNB6 

标题在上面。在响应中我收到一个错误:

{"detail":"CSRF Failed: CSRF token missing or incorrect."}

所以,后端一定已经验证了csrftoken

在后台数据库中找不到csrftoken字段:

所以我想知道它在加密的session_data中保存在哪里?

【问题讨论】:

  • 默认情况下,csrf 令牌存储在 cookie 中。你不会在数据库中找到它。如果您想将其存储在会话数据中,您可以设置CSRF_USE_SESSIONS
  • 但是如果后端不存储csrftoken怎么验证呢?
  • 如果您在 DRF 或任何 API 中,您可以排除 csrf 验证。
  • 你在哪里需要 csrf_token?

标签: python django django-csrf csrf-token


【解决方案1】:

鉴于 django 文档中的 QA,您可以看到框架默认使用 Double Submit Cookie 方法(而不是 同步器 模式) .

这种方法不需要服务器存储 CSRF 令牌,因为它所做的唯一检查是将 cookie 中的令牌与标头(或参数)中的令牌进行比较,并验证它们是否相等。

另一方面,synhronizer 模式确实将CSRF 令牌存储在服务器的某处,并且对于每个请求,它通过将其与通过标头发送的请求进行比较来验证其有效性(或者和以前一样,在 POST 参数中)。

您可以阅读有关这两种方法的更多信息here


我猜您正在使用 Web 服务测试应用程序测试您的 API,在这种情况下,您在请求中的某处丢失了第二个令牌。

This section 解释了如何为AJAX 调用放置令牌:

AJAX 虽然上述方法可以用于 AJAX POST 请求,但它有一些不便:您必须记住在每个 POST 请求中将 CSRF 令牌作为 POST 数据传递。为此,有一种替代方法:在每个 XMLHttpRequest 上,将自定义 X-CSRFToken 标头设置为 CSRF 令牌的值。这通常更容易,因为许多 JavaScript 框架提供了允许在每个请求上设置标头的钩子。

看到上面的请求,因此您应该放置此标头(当然是当前令牌的值):

X-CSRFToken: z53lKL0f7VHkilYS5Ax8FMaQCU2ceouje9OeTJOgTy4gH0UgHVltAlOe2KFNNNB6

【讨论】:

猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多