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

时间:2015-08-26 16:10:27

标签: python django csrf django-csrf

我的网站有一个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)

1 个答案:

答案 0 :(得分:2)

不,只要你没有在发布到外部网站的表单中呈现csrf令牌就没有问题(但无论如何,无论你在哪里实现它都会成为问题)。您可以在中间件,某些视图或所有视图上进行设置,但这并不重要。

CSRF保护仅用于确保请求来自您的网站。无论您设置cookie的频率如何,如果请求包含正确的CSRF令牌,则表示该请求确实来自您的网站,因为只有您的网站才能访问您的Cookie。 (当然,只有在您没有将CSRF令牌泄露给第三方时,例如通过将其发送到其他站点,这才会成立)

简而言之,这就是它的工作原理:

  1. 服务器在响应中设置带有随机值的cookie
  2. 您的网站会在发布数据时读取该值并将其发送到服务器
  3. 由于cookie只能从设置它们的同一域访问,因此其他站点无法读取该cookie。因此,每当您收到具有正确csrf令牌的请求时,您都可以确信该请求来自您的网站。
  4. 有关CSRF的非常好的解释,请查看本文:http://www.gnucitizen.org/blog/csrf-demystified/