0

我正在构建一个 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
4

2 回答 2

1

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

  • 生成一个命令行字符串,它会在您的文件上调用病毒扫描程序
  • 使用 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或多或少是相同的——所以如果你信任clamav,你应该做得很好。如果您不信任ist,请使用上述方法和您选择的病毒扫描程序。

于 2013-10-20T03:51:24.463 回答
0

您可以使用django-safe-filefield包来验证上传的文件扩展名是否匹配它的 MIME 类型。例子:

设置.py

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

表格.py

from safe_filefield.forms import SafeFileField

class MyForm(forms.Form):
    attachment = SafeFileField(
        scan_viruses=True,
    )
于 2018-02-07T09:48:14.643 回答