Django无cookie的CSRF保护。
项目描述
这是什么?
django-session-csrf 是 Django CSRF 保护的一种替代实现,不使用 cookies。相反,它使用 Django 的会话后端在服务器上维护 CSRF 令牌。CSRF 令牌仍然必须包含在所有 POST 请求中(要么在表单中包含 csrfmiddlewaretoken,要么在 X-CSRFTOKEN 标头中)。
安装
从PyPI安装
pip install django-session-csrf-per-view
从GitHub安装
git clone git://github.com/mozilla/django-session-csrf.git
在您的 TEMPLATE_CONTEXT_PROCESSORS 中将 django.core.context_processors.csrf 替换为 session_csrf.context_processor
TEMPLATE_CONTEXT_PROCESSORS = ( ... 'session_csrf.context_processor', ... )
在您的 MIDDLEWARE_CLASSES 中将 django.middleware.csrf.CsrfViewMiddleware 替换为 session_csrf.CsrfMiddleware,并确保它在 AuthenticationMiddleware 之后列出
MIDDLEWARE_CLASSES = ( ... 'django.contrib.auth.middleware.AuthenticationMiddleware', ... 'session_csrf.CsrfMiddleware', ... )
然后我们必须对 Django 进行 monkeypatch 来修复 @csrf_protect 装饰器
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 令牌存储在缓存中。它可以通过以下设置进行控制
- ANON_COOKIE
用于匿名用户cookie的名称
默认值:anoncsrf
- ANON_TIMEOUT
用于匿名CSRF令牌的缓存超时时间(以秒为单位)
默认值:60 * 60 * 2 # 2小时
注意,默认情况下Django使用本地内存缓存,这不会与多个Web服务器线程一起使用匿名CSRF。要使用匿名CSRF,您必须配置一个在Web服务器实例之间共享的缓存,例如Memcached。有关更多信息,请参阅Django缓存文档。
如果您只想让视图对已登录用户具有CSRF保护,可以使用anonymous_csrf_exempt装饰器。例如,如果匿名视图通过CAPTCHA进行保护,这可能会很有用。
from session_csrf import anonymous_csrf_exempt @anonymous_csrf_exempt def protected_in_another_way(request): ...
如果您想使所有视图对匿名用户具有CSRF保护,请使用以下设置
- ANON_ALWAYS
始终为匿名用户提供CSRF保护
默认值:False
每个操作的CSRF令牌
要使用每个操作的CSRF令牌,您需要装饰您的视图
from session_csrf.decorators import per_view_csrf
@per_view_csrf
def your_view(request):
pass
或者对于基于类的视图
from django.views.generic import TemplateView
from session_csrf.mixins import PerViewCsrfMixin
class YourView(PerViewCsrfMixin, TemplateView):
pass
并在您的模板中添加模板标签
{% load session_csrf %}
<form>
{% per_view_csrf "app.views.your_view" %}
</form>
为什么我想要这个?
您的网站位于其他不在您控制之下的子域中,因此cookie可能来自任何地方。
您担心攻击者使用Flash伪造HTTP头。
您厌倦了需要引用头。
为什么我不想要这个?
将令牌存储在会话中意味着您必须更频繁地访问会话存储。
为匿名用户CSRF保护表单需要更多的工作。
项目详情
django-session-csrf-per-view-0.5.3.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7510e11adae359d63bce027ede5eb21a3e33fb4865195d6aebe2a1b53d125546 |
|
MD5 | 628534c585e37e4e0033a4c08c774686 |
|
BLAKE2b-256 | 467ad9f28ac1349e36aa33bdb43cde615a6822d1972d066f2f9f312b231fc243 |