使Django模型安全

时间:2015-07-02 21:47:12

标签: django html5lib

我正在构建一个高性能的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方法和表单提供通用保护的最佳方法是什么,并且能够覆盖行为。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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是否适合您的方案。