重複の可能性:
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 ファイルの特徴ではないものが含まれていますか?