跳转到主要内容

此Django应用程序添加了一个新的字段类型,ValidatedFileField,该字段类型增加了检查用户可能发送的文档大小和类型的 功能。

项目描述

https://travis-ci.org/kaleidos/django-validated-file.png?branch=master https://coveralls.io/repos/kaleidos/django-validated-file/badge.png?branch=master https://pypip.in/v/django-validated-file/badge.png https://pypip.in/d/django-validated-file/badge.png

此Django应用程序添加了一个新的字段类型,ValidatedFileField,该字段类型增加了检查用户可能发送的文档大小和类型的 功能。

安装

  • 使用python setup.py install下载并安装包。

  • 请注意,此包依赖于python-magic(用于检查字段类型)。

  • 将‘validatedfile’添加到settings.py中的INSTALLED_APPS中。

验证单个文件

创建一个模型并添加一个类型为ValidatedFileField的字段。您可以添加最大大小(以字节为单位)和允许的有效MIME类型列表。所有MIME类型的列表可在此处找到: http://www.iana.org/assignments/media-types/index.html

from django.db import models
from validatedfile.fields import ValidatedFileField

class TestModel(models.Model):
    the_file = ValidatedFileField(
                    null = True,
                    blank = True,
                    upload_to = 'testfile',
                    max_upload_size = 10240,
                    content_types = ['image/png'])

此模型可以像正常FileField一样在表单或模型表单中使用。如果用户尝试上传过大或没有有效类型的文件,将发生表单验证错误。

验证配额使用情况

此示例还检查一个用户上传的所有文件的总大小

(in models.py)

from django.contrib.auth.models import User
from django.db import models
from validatedfile.fields import ValidatedFileField

class TestModel(models.Model):
    user = models.ForeignKey(
                    User,
                    null = False,
                    blank = False,
                    related_name = 'test_models')
    the_file = ValidatedFileField(
                    null = True,
                    blank = True,
                    upload_to = 'testfile',
                    max_upload_size = 10240,
                    content_types = ['image/png'])

(in forms.py)

from django import forms
from validatedfile.fields import QuotaValidator
from models.py import TestModel

class TestModelForm(models.ModelForm):
    the_file = forms.FileField(
                    required = True,
                    validators = [QuotaValidator(max_usage = 102400)])

    class Meta:
        model = TestModel
        fields = ['the_file']

    def __init__(self, user, *args, **kwargs):
        super(TestModelForm, self).__init__(*args, **kwargs)
        self.user = user
        self.fields['the_file'].validators[0].update_quota(
                items = self.user.test_models.all(),
                attr_name = 'the_file',
            )

    def exceeds_quota(self):
        return self.fields['the_file'].validators[0].quota.exceeds()

    def save(self, *args, **kwargs):
        model = super(TestModelForm, self).save(commit = False)
        model.user = self.user
        model.save()

关于DOS攻击的说明

重要提示:文件大小检查是在整个文件上传到服务器并存储在临时目录(如果文件较小,则存储在内存中)后由Django进行的。因此,这对于保证用户的配额很有用,例如,但不会阻止想要通过发送大文件(例如数GB)来阻塞服务器的攻击用户。

为了避免这种情况,您需要配置您的前端以限制上传文件的大小。如何操作取决于您使用的软件。例如,如果您使用Apache,应使用 LimitRequestBody 指令(https://httpd.apache.ac.cn/docs/2.2/mod/core.html#limitrequestbody)。

这是一个补充措施,因为您通常希望超过合理大小的普通用户收到友好的表单验证消息,而攻击用户将在文件上传完成之前看到他们的连接突然中断。因此,建议将 max_upload_size 设置为一个较小的值(例如5Mb),并将 LimitRequestBody 设置为一个较大的值(例如100Mb)。

项目详情


下载文件

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

源分布

django-validated-file-2.0.1.tar.gz (8.0 kB 查看哈希值)

上传时间

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