Django:在所有响应中强制使用 CSRF 令牌

Django: Forcing CSRF token on all responses

我的网站有一个 AJAX POST 视图,可以从应用程序的任何页面调用(事件跟踪)。此视图受 CSRF 保护。在某些情况下,CSRF cookie 未设置,POST 调用失败。

我没有使用 @ensure_csrf_cookie 手动装饰所有视图,我正在考虑编写 我创建了一个中间件,它强制 Django 在所有响应上设置 CSRF cookie。这种方法正确吗?它会产生我不知道的安全漏洞吗?

更新:中间件代码如下:

from django.middleware.csrf import get_token

class ForceCsrfCookieMiddleware(object):
    def process_request(self, request):
        get_token(request)

不,只要您不在发布到外部站点的表单中呈现 csrf 令牌就没有问题(但这无论如何都会有问题,无论您在何处实现它)。你可以设置在中间件上,也可以设置在某些视图上,也可以设置在所有视图上,都没有关系。

CSRF 保护只是为了确保请求来自您的网站。无论您设置 cookie 的频率如何,如果请求包含正确的 CSRF 令牌,则意味着该请求确实来自您的站点,因为只有您的站点才能访问您的 cookie。 (当然,这只有在您没有将 CSRF 令牌泄露给第三方(例如将其发送到其他站点)的情况下才成立)

简而言之,它是这样工作的:

  1. 服务器在响应中设置一个带有随机值的 cookie
  2. 您的站点读取该值并在发布数据时将其发送到服务器
  3. 由于只能从设置它们的同一域访问 cookie,因此其他站点无法读取该 cookie。因此,无论何时您收到具有正确 csrf 令牌的请求,您都可以确信该请求来自您的站点。

关于 CSRF 的很好的解释,请看这篇文章:http://www.gnucitizen.org/blog/csrf-demystified/