上传的文件类型验证

我需要验证上传文件的文件类型,并且应该只允许pdf,普通测试和MS文件。 这里是我的模型和具有验证功能的表单。 但是,即使没有扩展名,我也可以上传文件。

class Section(models.Model):
    content = models.FileField(upload_to="documents")

class SectionForm(forms.ModelForm):
    class Meta:
        model = Section
    FILE_EXT_WHITELIST = ['pdf','text','msword']

    def clean_content(self):
        content = self.cleaned_data['content']
        if content:
            file_type = content.content_type.split('/')[0]
            print file_type
            if len(content.name.split('.')) == 1:
                raise forms.ValidationError("File type is not supported.")
            if content.name.split('.')[-1] in self.FILE_EXT_WHITELIST:
                return content
            else:
                raise forms.ValidationError("Only '.txt' and '.pdf' files are allowed.")

这里是观点,

def section_update(request, object_id):
    section = models.Section.objects.get(pk=object_id)
    if 'content' in request.FILES:
            if request.FILES['content'].name.split('.')[-1] == "pdf":
                content_file = ContentFile(request.FILES['content'].read())
                content_type = "pdf"
                section.content.save("test"+'.'+content_type , content_file)
                section.save()

在我看来,我只是从request.FILE保存文件。 我认为保存()它会调用clean_content并进行内容类型验证。 我想,clean_content根本就不需要验证。


你的方法是行不通的:作为一个攻击者,我可以简单地伪造HTML头部,向你发送任何含有MIME类型text/plain

正确的解决方案是在Unix上使用像file(1)这样的工具来检查文件的内容以确定它是什么。 请注意,没有什么好方法可以知道某件事是否真的是纯文本。 如果文件以16位Unicode保存,“纯文本”甚至可以包含0个字节。

看到这个问题的选项如何做到这一点:如何在Python中找到一个文件的MIME类型?

链接地址: http://www.djcxy.com/p/46807.html

上一篇: Uploaded file type validation

下一篇: How to Email a Django FileField as an Attachment?