无cookies的django的csrf保护。
django-session-csrf-per-view的Python项目详细描述
这是什么?
django-session-csrf是django的csrf的另一种实现 不使用cookies的保护。相反,它将csrf令牌保持在 使用django会话后端的服务器。CSRF令牌必须仍然是 包含在所有post请求中(表单中的csrfmiddlewaretoken或 使用x-csrftoken头)。
安装
来自PYPI:
pip install django-session-csrf-per-view
来自github:
git clone git://github.com/mozilla/django-session-csrf.git
将django.core.context_processors.csrf替换为 session_csrf.context_processor在您的TEMPLATE_CONTEXT_PROCESSORS:
TEMPLATE_CONTEXT_PROCESSORS = ( ... 'session_csrf.context_processor', ... )
将django.middleware.csrf.CsrfViewMiddleware替换为 session_csrf.CsrfMiddleware在您的^{tt7}中$ 并确保它列在AuthenticationMiddleware之后:
MIDDLEWARE_CLASSES = ( ... 'django.contrib.auth.middleware.AuthenticationMiddleware', ... 'session_csrf.CsrfMiddleware', ... )
然后我们必须修改@csrf_protectdecorator:
import session_csrf session_csrf.monkeypatch()
确保它位于根目录urls.py中,这样补丁就可以 在导入视图之前应用。
与Django的差异
django-session-csrf不将csrf令牌分配给匿名用户,因为 我们不想为每个匿名用户支持会话。相反,视图 需要匿名表单的可以用@anonymous_csrf:
from session_csrf import anonymous_csrf @anonymous_csrf def login(request): ...
anonymous_csrf使用缓存为匿名用户提供轻量级 会议。它发送一个cookie来唯一标识用户并存储csrf 缓存中的令牌。它可以通过以下设置进行控制:
- ^{tt13}$
the name used for the anonymous user’s cookie
Default: ^{tt14}$
- ^{tt15}$
the cache timeout (in seconds) to use for the anonymous CSRF tokens
Default: ^{tt16}$
请注意,默认情况下,django使用本地内存缓存,这不会 如果有多个Web服务器线程,请使用匿名CSRF。 要使用匿名csrf,必须配置共享的缓存 在web服务器实例之间,例如memcached。见Django cache documentation 更多信息。
如果只希望视图对已登录的用户具有csrf保护,则可以 使用anonymous_csrf_exemptdecorator。如果 例如,匿名视图通过验证码进行保护。
from session_csrf import anonymous_csrf_exempt @anonymous_csrf_exempt def protected_in_another_way(request): ...
如果希望所有视图对匿名用户具有csrf保护,请使用 以下设置:
- ^{tt18}$
always provide CSRF protection for anonymous users
Default: False
每个操作csfr令牌
对于使用每个动作的csrf令牌,您需要装饰您的视图:
fromsession_csrf.decoratorsimportper_view_csrf@per_view_csrfdefyour_view(request):pass
或基于类的视图:
fromdjango.views.genericimportTemplateViewfromsession_csrf.mixinsimportPerViewCsrfMixinclassYourView(PerViewCsrfMixin,TemplateView):pass
并在模板中添加模板标记:
{%loadsession_csrf%}<form>{%per_view_csrf"app.views.your_view"%}</form>
我为什么要这个?
- 您的站点位于子域上,而其他站点不在 控制,所以饼干可以从任何地方来。
- 您担心攻击者使用flash伪造http头。
- 你已经厌倦了需要一个引用头。
为什么我不想要这个?
- 在会话中存储令牌意味着您必须更多地访问会话存储 经常。
- csrf保护匿名用户的表单需要做更多的工作。