Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PDF';Django的细菌和病毒_Python_Django_Security_Pdf - Fatal编程技术网

Python PDF';Django的细菌和病毒

Python PDF';Django的细菌和病毒,python,django,security,pdf,Python,Django,Security,Pdf,我正在构建一个web应用程序(python和Django),允许用户上传pdf文件供其他用户下载。如何防止用户上传嵌入在pdf中的病毒 更新: 我在使用clamcv的django代码段中找到了这段代码。这样行吗 def clean_file(self): file = self.cleaned_data.get('file', '') #check a file in form for viruses if file: from tempfile impo

我正在构建一个web应用程序(python和Django),允许用户上传pdf文件供其他用户下载。如何防止用户上传嵌入在pdf中的病毒

更新: 我在使用clamcv的django代码段中找到了这段代码。这样行吗

def clean_file(self):
    file = self.cleaned_data.get('file', '')
    #check a file in form for viruses
    if file:
        from tempfile import mkstemp
        import pyclamav
        import os
        tmpfile = mkstemp()[1]
        f = open(tmpfile, 'wb')
        f.write(file.read())
        f.close()
        isvirus, name = pyclamav.scanfile(tmpfile)
        os.unlink(tmpfile)
        if isvirus:
            raise forms.ValidationError( \
            "WARNING! Virus \"%s\" was detected in this file. \
            Check your system." % name)

    return file

一般来说,你可以使用任何病毒扫描软件来完成这个任务:只要

  • 生成一个命令行字符串,用于调用文件上的病毒扫描程序
  • 使用python子流程运行命令行字符串,如下所示:

    try:
        command_string = 'my_virusscanner -parameters ' + uploaded_file
        result = subprocess.check_output(command_string,stderr=subprocess.STDOUT,shell=True)
        #if needed, do something with "result"            
    except subprocess.CalledProcessError as e:
        #if your scanner gives an error code when detecting a virus, you'll end up here
        pass 
    except:
        #something else went wrong
        #check sys.exc_info() for info
        pass
    
在不检查源代码的情况下,我假设
pyclamav.scanfile
所做的或多或少是相同的-因此如果您信任,您应该做得很好。如果您不信任ist,请使用您选择的病毒扫描程序使用上述方法。

您可以使用软件包验证上载的文件扩展名是否与MIME类型匹配。例如:

设置.py

forms.py


安装一个病毒扫描器,在上传后和存储之前扫描文件…Hello@Mixkorsun我使用了这个软件包,但当我在管理员端上传文件时,出现了这个错误:
“FieldFile”对象没有“content\u type”属性。
。当我使用
邮递员请求发送文件时,它工作得非常好。
CLAMAV_SOCKET = 'unix://tmp/clamav.sock'  # or tcp://127.0.0.1:3310

CLAMAV_TIMEOUT = 30  # 30 seconds timeout, None by default which means infinite
from safe_filefield.forms import SafeFileField

class MyForm(forms.Form):
    attachment = SafeFileField(
        scan_viruses=True,
    )