Django的/ Python的:如何读取文件,并验证它是音频文件? [重复](Django/P

2019-07-18 02:01发布

可能重复:
Django的(音频)文件验证

我建立一个web应用程序,让使用者可以上传的媒体内容,包括音频文件。

我有我的AudioFileUploadForm清洁方法验证以下内容:

  • 该音频文件不是太大。
  • 该音频文件有一个有效的content_type(MIME类型)。
  • 该音频文件有一个有效的扩展。

不过,我担心安全 。 用户可以上载带有恶意代码的文件,并且容易地通过上述验证。 我想接下来做的就是验证音频文件,着实的音频文件(其写入磁盘之前)。

我应该怎么办呢?

class UploadAudioForm(forms.ModelForm):
    audio_file = forms.FileField()

    def clean_audio_file(self):
        file = self.cleaned_data.get('audio_file',False):
            if file:
                if file._size > 12*1024*1024:
                    raise ValidationError("Audio file too large ( > 12mb )")
                if not file.content_type in ['audio/mpeg','audio/mp4', 'audio/basic', 'audio/x-midi', 'audio/vorbis', 'audio/x-pn-realaudio', 'audio/vnd.rn-realaudio', 'audio/x-pn-realaudio', 'audio/vnd.rn-realaudio', 'audio/wav', 'audio/x-wav']:
                    raise ValidationError("Sorry, we do not support that audio MIME type. Please try uploading an mp3 file, or other common audio type.")
                if not os.path.splitext(file.name)[1] in ['.mp3', '.au', '.midi', '.ogg', '.ra', '.ram', '.wav']:
                    raise ValidationError("Sorry, your audio file doesn't have a proper extension.")
                # Next, I want to read the file and make sure it is 
                # a valid audio file. How should I do this? Use a library?
                # Read a portion of the file? ...?
                if not ???.is_audio(file.content):
                    raise ValidationError("Not a valid audio file.")
                return file
            else:
                raise ValidationError("Couldn't read uploaded file")

编辑:通过“验证音频文件,着实音频文件”,我指的是以下几点:

包含典型的音频文件的数据的文件。 我很担心,用户可以上传与相应的头文件和恶意脚本的音频数据的地方。 例如......是MP3文件的MP3文件? 或者它包含一些不寻常的一个mp3文件吗?

Answer 1:

其他公布答案,的确另一种header解析。 这意味着有人可能仍落后包含一个有效的标头的其他数据。

是验证整个文件花费更多的CPU,但也有更严格的政策。 可以做到这一点的库是蟒蛇audiotools和相关API方法是AudioFile.verify 。

使用这样的:

import audiotools

f = audiotools.open(filename)
try:
    result = f.verify()
except audiotools.InvalidFile:
    # Invalid file.
    print("Invalid File")
else:
    # Valid file.
    print("Valid File")

警告是,这种verify方法是非常严格的,而且实际上严重标志编码的文件为无效。 你必须自己决定,如果这是你的使用情况适当的方法还是不行。



Answer 2:

我们的想法是使用一个实用工具,如sndhdr尝试读取该文件的标题。

from sndhdr import what
import os
from settings import MEDIA_ROOT
...
if what( os.path.join( MEDIA_ROOT, file.name ) ) == None:
# header parse failed, so, it could be a non-audio file.

在这种情况下,你必须确保该实用程序无法识别非音频文件作为音频文件。

我从来没有使用sndhdr工具,因此,它可能是最好使用另外一个。 例如也有诱变剂项目。

更新

更专业的方法。

  1. 让用户上传自己的文件,而这样的验证。
  2. 创建一个文件关联的特殊型号场:is_checked。 设置字段默认为false。
  3. 不要让其他用户downoad已is_checked文件==假
  4. 组织运行该检查未检查文件的反恶意软异步任务。 该软件必须被称为从你的Python的任务的功能。 该功能必须回答这样的问题:是一个特定的文件中有一个恶意软件的一部分。
  5. 如果当前的文件具有恶意软件删除部分,并删除有关该文件的记录。 否则,建立is_checked =从你的任务真。

为什么分开的任务吗? 因为这样的恶意软件检查可长时间操作。



文章来源: Django/Python: How to read a file and validate that it is an audio file? [duplicate]