Python PDF';Django的细菌和病毒
我正在构建一个web应用程序(python和Django),允许用户上传pdf文件供其他用户下载。如何防止用户上传嵌入在pdf中的病毒 更新: 我在使用clamcv的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
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,
)