如何使用Django保护文件上传

时间:2019-03-22 06:24:15

标签: django

下面的代码通过将文件上传到服务器,效果很好。

请我如何通过检查文件大小(例如2mb),文件扩展名, 进行Mimetype文件检查和其他检查,以确保仅上传.jpg,.gif,.png之类的图片,而不上传病毒。

model.py

from django.db import models

# Create your models here.
class File(models.Model):
    file = models.FileField()

    def __str__(self):
        return self.file.name

View.py

from django.shortcuts import render
from django.core.files.storage import FileSystemStorage
from .models import File
import os, datetime

from .forms import uploadForm

# Create your views here.

def index(request):
    if request.method == 'POST' and request.FILES:

        form = uploadForm(request.POST,request.FILES)


        if form.is_valid():
            file = request.FILES['file']
            # process the data in form.cleaned_data as required
            file_object = form.cleaned_data['file']
            extension = os.path.splitext(file_object.name)[1]
            rename = datetime.datetime.now().strftime("%Y_%m_%d %H_%M_%S") + extension
            fss = FileSystemStorage()
            filename = fss.save(rename, file_object)
            file = File(file=rename)
            file.save()
            upload_file_path = fss.path(filename)

            return render(request, 'file/index.html', {
            'upload_file_path': upload_file_path})
            print('uploaded')
        else:
            print("Not Valid")

    else:
        return render(request, 'file/index.html')

forms.py

from django import forms

class uploadForm(forms.Form):
    #file = forms.CharField()
     file = forms.FileField()

1 个答案:

答案 0 :(得分:1)

您不能信任文件的任何元数据来确定内容。我可以向您发送扩展名为.txt的文件,该文件可以在您的计算机上执行。

处理此问题的唯一相对安全的方法是检查内容。这并不简单,因此您应该使用现有的第三方库之一,例如python-magic

即使那样,也有一些方法可以愚弄它,将内容包装在其他内容的注释字段中,等等。

您应该从不执行用户提交的内容。