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

Tza*_*ach 11 python django csrf django-csrf

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

不用手动装饰都与意见@ensure_csrf_cookie,我想写作的我创建的强制Django的设置CSRF饼干上所有响应中间件.这种方法是否正确?它是否会造成我不知道的安全漏洞?

更新:这是中间件代码:

from django.middleware.csrf import get_token

class ForceCsrfCookieMiddleware(object):
    def process_request(self, request):
        get_token(request)
Run Code Online (Sandbox Code Playgroud)

tom*_*mas 2

不,只要您不在发布到外部站点的表单中渲染 csrf 令牌,就没有问题(但这无论如何都会是一个问题,无论您在哪里实现它)。您可以在中间件上设置它,或者在某些视图上设置它,或者在所有视图上设置它,这并不重要。

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

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

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

有关 CSRF 的详细解释,请查看这篇文章: http: //www.gnucitizen.org/blog/csrf-demystified/