【问题标题】:Make a Django model form safe使 Django 模型表单安全
【发布时间】:2015-07-02 21:47:11
【问题描述】:

我正在构建一个高性能 API。我已经使用 Tastypie 多年了,有时我只需要更简单。对于这个 API,我决定使用 Django Simple Rest (https://github.com/croach/django-simple-rest)。它提供了所需的基础,我可以使用表单和 ORM 来验证和保存数据,而无需通用 API 库开销。

我想验证传入的数据。我正在使用模型表单来执行此操作。它既好又简单,它可以根据模型验证数据,但我需要更多。

我想确保没有脚本或 HTML 被发布。对于某些字段,我可能允许使用 HTML。我知道我可以使用 html5lib 进行各种验证,我可能会,但我看到的唯一示例是您指定每个字段的地方。我正在尝试找出一种方法来默认防止将 javascript 或 HTML 输入到字段中并能够根据需要进行覆盖。我不想用表格来描述每个模型,我想要一些通用的东西。

这是我最简单的 put 函数。

    def put(self, request, *args, **kwargs):
        data = json.loads(request.body)
        try:
            todo = Item.objects.get(id=kwargs.get('id'))
        except Item.DoesNotExist:
            return HttpNotFound()

        form = TodoForm( instance=todo, data=data )
        if not form.is_valid():
            return JsonFormErrors( form )
        form.save()

        return JsonStatus(True, message="saved successfully")

这是我的表格。

from django import forms
from .models import *

class TodoForm(forms.ModelForm):

    class Meta:

        model = Item
        fields = ('id', 'text')

如果我想接受 HTML,什么是为我的所有 put 方法和表单提供通用保护的最佳方法,并且能够覆盖行为。

感谢您的帮助!

丰富

【问题讨论】:

  • 你很可能想用lxml.html.clean()lxml.de/lxmlhtml.html清理你的任意HTML输入
  • 好的,但是要优雅地如何在所有输入中发生这种情况。我正在尝试扩展我认为的模型表单的功能。

标签: django html5lib


【解决方案1】:

您也许可以创建一个继承自 ModelForm 的新类,该类会立即清除每个值。

我在想这样的事情:

from django import forms
from lxml.html.clean import clean_html

class SanitizedModelForm(ModelForm):
    def __init__(self, data=None, *args, **kwargs):
        if data is None:
            data = {}
        sanitized_data = {}
        for key, value in data:
            sanitized_data[key] = clean_html(value)
        super(SanitizedModelForm, self).__init__(sanitized_data, *args, **kwargs)

我不确定clean_html 是否适合您的场景。

【讨论】:

  • 谢谢@Schillingt。这是正确的解决方案,我最终选择了 html5lib,但子类化是我需要的技巧。
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多