Django的安全格式扩展
django-careful-forms的Python项目详细描述
django careed forms是django’s Forms system上的一个小扩展。它 可以帮助您发现表单中潜在的安全隐患。
如果在窗体上定义的任何字段没有 已被访问(未被访问的字段也将没有 已在模板中呈现/显示给用户)。
示例
考虑以下示例:
# models.py:classSomeModel(models.Model):name=models.CharField(max_length=100)email=models.CharField(max_length=100)is_admin=models.BooleanField()classSomeForm(ModelForm):classMeta:model=SomeModel# template:{{form.name}}{{form.email}}
您可能已经注意到模型表单的Meta类未命中 excludeis_admin字段的定义(假设这是一个 将显示给最终用户)。
现在乍一看,这不会造成任何问题,因为只有模板 显示名称和电子邮件字段。但是忘记排除 is_admin域允许用户更改 应用程序(在这个假设的例子中获得管理权限)。
如果我们将此示例改为使用谨慎的表单,则缺少的字段将 触发一个警告(甚至是一个异常,具体取决于设置,请参见下文)。 提醒您注意该漏洞。
动机
这个包的最初动机来自最近rails框架中的well publicized ‘mass assignment’ vulnerability。具体情况不是 重要的是,基本问题是未经检查地将请求数据分配到 模型。
当然,django不易受这个特殊问题的影响,因为它 形成系统。但是,即使在使用表单系统时(特别是在使用 模型表单)仍然可能无意中允许请求数据 写入应该是私有的模型字段(例如,忘记 排除内部字段)。
然而,最后一个导火索是埃里克·罗米金在2012年欧洲djangocon大会上的精彩演讲,其中明确提到了表单陷阱。 在slide 53ff.
兼容性
- Python2.6+
- Django 1.3+
用法
- 将"careful_forms.middleware.CarefulFormsMiddlware"添加到项目中 settings.MIDDLEWARE_CLASSES。你应该把它加在 列出以确保所有表格都被覆盖。
- 对于您希望由django监视的每个表单,都要仔细更改表单 表单的基类到careful_forms.forms.CarefulModelForm(或 CarefulForm对于常规表单)[1]。
[1] | In case you already have a custom form base class you can also add ^{tt8}$ to it. |
示例:
classMyForm(CarefulForm):# ...classOtherForm(CarefulModelForm):# ...classYetMoreForms(CarefulFormMixin,CustomFormBaseClass):# ...
设置
小心开启
默认值:settings.DEBUG
此设置是django careed forms的“主开关”。当设置为^{tt10}时$ 已访问表单字段的记录处于活动状态,warnings将 为未访问字段触发。因为订书机 (small)每个挂起的请求在默认情况下仅在DEBUG模式下启用。
当设置为^{tt12}时,$不会引入预请求运行时开销。
小心异常开启警告
默认值:False
当设置为True时,将引发异常,而不是在 检测到访问字段。