【发布时间】:2013-12-20 03:07:18
【问题描述】:
我目前的设置是 AngularJS + Django 1.5,我完全放弃了使用 Django 的模板引擎(即后端几乎是一个 API 服务器)。
由于我没有使用 csrf_token 模板标签,因此 Django 不会设置和发送 csrftoken cookie 作为响应。按照官方文档的指示,应该使用ensure_csrf_cookie() 装饰器来强制装饰视图发送csrftoken cookie。
我已将ensure_csrf_cookie() 装饰器应用于视图,它为我的Web 客户端在引导时调用的第一个GET 请求提供服务。这样,我的 Web 客户端就获得了 CSRF 令牌,此后就可以向服务器调用不安全的方法(例如 POST)。
只有在浏览会话结束之前 CSRF 令牌保持不变时,上述设置才能正常工作。
问题: Django 的 CSRF 令牌会在浏览会话期间更新吗?如果“是”,这是否意味着我需要将 ensure_csrf_cookie() 装饰器应用于我拥有的所有视图?
【问题讨论】:
-
1) 不太可能,但恕我直言,这是一个实现细节,我建议不要依赖这种行为。 2) 只需编写一个由
ensure_csrf_cookie()修饰的 Mixin 或 View 基类,并将其用作 API 视图的基础(可能还有很多样板代码您也可以移到那里)。 -
谢谢@PauloScardine。我同意你所说的。如果为所有服务器响应设置了 csrf 令牌 cookie,会不会有任何安全隐患?
-
AFAIK 没有安全隐患,像 Django-REST-Framework 这样的框架可以做到这一点——事实上,你应该在下一个项目中考虑它,因为它为你提供了诸如分页、节流和花哨的权限系统之类的东西。
-
@PauloScardine - 哈哈。我正在为当前项目使用 Django REST Framework。我喜欢它。但我没有看到 rest_framework 在其基本视图(即 APIView)或其任何通用视图中强制 CSRF cookie。我错过了什么吗?请注意,我有 rest_framework v2.3.8。
-
您是否启用了基于会话的身份验证?
标签: ajax django csrf django-csrf