我的网站有一个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)
答案 0 :(得分:2)
不,只要你没有在发布到外部网站的表单中呈现csrf令牌就没有问题(但无论如何,无论你在哪里实现它都会成为问题)。您可以在中间件,某些视图或所有视图上进行设置,但这并不重要。
CSRF保护仅用于确保请求来自您的网站。无论您设置cookie的频率如何,如果请求包含正确的CSRF令牌,则表示该请求确实来自您的网站,因为只有您的网站才能访问您的Cookie。 (当然,只有在您没有将CSRF令牌泄露给第三方时,例如通过将其发送到其他站点,这才会成立)
简而言之,这就是它的工作原理:
有关CSRF的非常好的解释,请查看本文:http://www.gnucitizen.org/blog/csrf-demystified/