跳转到主要内容

针对安全性的django表单扩展

项目描述

Django Careful Forms是Django表单系统之上的一个小扩展。它可以帮助您发现表单中可能存在的潜在安全疏忽。

如果表单中定义了任何未访问的字段,它将发出警告(假设未访问的字段也不会在模板中渲染或显示给用户)。

示例

考虑以下示例

# models.py:

class SomeModel(models.Model):
    name = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
    is_admin = models.BooleanField()


class SomeForm(ModelForm):
    class Meta:
        model = SomeModel

# template:

{{ form.name }}
{{ form.email }}

您可能会注意到模型表单的Meta类缺少对is_admin字段的exclude定义(假设这是一个将向最终用户显示的表单)。

乍一看,这不会引起任何问题,因为模板只显示名称和电子邮件字段。然而,由于忘记了排除is_admin字段,您允许用户更改应用程序内部的状态(在这个假设的例子中,获得管理员权限)。

如果我们用careful-forms替换这个示例,缺失的字段将触发警告(或者根据设置甚至抛出异常,见下文),提醒您存在漏洞。

动机

这个包的初始动机来自于最近在Rails框架中广为人知的“mass assignment”漏洞。具体细节不重要,但基本问题是请求数据未检查就赋值给模型。

当然,Django 并不会受到这个特定问题的困扰,因为其表单系统。然而,即使在使用表单系统(尤其是使用模型表单)的情况下,仍然可能无意中允许请求数据写入应属私有的模型字段(例如,通过忘记排除内部字段)。

然而,最终的触发因素是 Erik Romijn 在 2012 年 djangocon 欧洲 上关于构建安全 Django 网站的精彩演讲 Building secure Django websites,在演讲的第 53ff 页中明确提到了表单陷阱。

兼容性

  • Python 2.6+

  • django 1.3+

安装

简单且推荐的方式

#~ pip 安装 django-careful-forms

使用方法

  1. "careful_forms.middleware.CarefulFormsMiddlware" 添加到项目的 settings.MIDDLEWARE_CLASSES 中。您应该将其添加到列表的早期位置,以确保所有表单都得到覆盖。

  2. 对于您希望由 django-careful-forms 监控的每个表单,将您表单的基础类更改为 careful_forms.forms.CarefulModelForm(或对于常规表单使用 CarefulForm[1]

示例

class MyForm(CarefulForm):
    # ...

class OtherForm(CarefulModelForm):
    # ...

class YetMoreForms(CarefulFormMixin, CustomFormBaseClass):
    # ...

设置

CAREFUL_ENABLED

默认值:settings.DEBUG

这个设置是 django-careful-forms 的“主开关”。当设置为 True 时,访问的表单字段的记录是激活的,并且对于未访问的字段将触发 警告。由于账本机制会导致(小的)每个请求开销,因此默认情况下仅在 DEBUG 模式下启用。

当设置为 False 时,不会引入预请求运行时开销。

CAREFUL_EXCEPTION_ON_WARNING

默认值:False

当设置为 True 时,检测到未访问的字段时,将引发异常而不是警告。

项目详情


下载文件

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

源分发

django-careful-forms-0.1.tar.gz (7.8 kB 查看散列

上传时间

由以下支持

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