跳转到主要内容

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>

为什么我想要这个?

  1. 您的网站位于其他不在您控制之下的子域中,因此cookie可能来自任何地方。

  2. 您担心攻击者使用Flash伪造HTTP头。

  3. 您厌倦了需要引用头。

为什么我不想要这个?

  1. 将令牌存储在会话中意味着您必须更频繁地访问会话存储。

  2. 为匿名用户CSRF保护表单需要更多的工作。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面