针对安全性的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
使用方法
将 "careful_forms.middleware.CarefulFormsMiddlware" 添加到项目的 settings.MIDDLEWARE_CLASSES 中。您应该将其添加到列表的早期位置,以确保所有表单都得到覆盖。
对于您希望由 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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 901f7ab8b3087b2dfd93e43ba7db3507c36a8f86a39918be2e87cf577f3411c5 |
|
MD5 | aedb05437b81c11fcc05ee506cb34e5d |
|
BLAKE2b-256 | 0ff46a4b1826316351e10655f0843f700923225abe74ef65b84cd87a3760df5b |