适当的文件上传验证

时间:2011-11-15 02:47:11

标签: django validation file-upload

背景

在目标问题跟踪应用程序(在django中)中,用户可以向内部邮件添加文件附件。文件主要是不同的图像格式,办公文档和电子表格(微软或开放式办公室),PDF和PSD。

自定义文件字段类型(扩展名为FileField的类型)当前验证文件不超过给定大小,并且文件content_type位于应用程序MIME类型“白名单”中。但由于用户群非常多样化(多国家和多平台),我们经常不得不调整我们的白名单,因为使用旧版本或全新应用程序版本的用户具有不同的MIME类型(即使它们是有效文件,并且通过以下方式正确打开业务中的其他用户)。

注意:文件不是由apache“执行”的,它们只是存储(使用unix权限600)并且可以由用户下载。

问题

不同类型的验证有哪些优点和内容?

一些选择:

  • MIME类型白名单或黑名单
  • 列表或黑名单时的文件扩展名
  • Django file upload input validation and security甚至建议“你必须实际读取文件,以确保它是JPEG,而不是.EXE”(当要加入多种类型的文件时,它是否可行?)

是否有'正确'的方式来验证文件上传?

修改

让我澄清一下。我可以理解,实际上检查程序中应该打开它的整个文件以确保它工作并且没有被破坏将是唯一的方法来完全确认文件是它所说的那样,并且它不是' t corrupted。

但有问题的文件就像电子邮件附件。我们不可能验证每个PSD是有效且有效的Photoshop图像,JPG或任何其他类型也是如此。即使它是它所说的,我们也不能保证它是一个功能齐全的文件。

所以我希望得到的是:文件魔法绝对至关重要吗?它真正增加了什么保护? MIME类型白名单实际上是否实际添加了文件扩展名白名单所没有的任何保护?如果文件的文件扩展名为CSV,JPG,GIF,DOC,PSD是否真的可行,即使应用程序本身不依赖于文件,检查它是否正如它所说的那样?

使用简单的文件扩展名白名单除了明显的违规者(EXE,BAT等)以及我认为禁止对用户有危险的文件是否有危险?

1 个答案:

答案 0 :(得分:0)

验证文件的最佳方式是使用魔法。

呃,就是magic。文件可以通过其内容的前几个字节来识别。它通常比扩展或mime类型更准确,因为您通过它包含的内容来判断文件是什么,而不是浏览器或用户声称它是什么。

FileMagic on the Python wiki

上有一篇文章

您也可以考虑使用python-magic

请注意,在使用magic来确定它是什么之前,您不需要获取整个文件。您可以读取文件的第一个块并发送这些字节以通过文件魔法识别。

澄清

只是要指出使用魔法识别文件实际上只是意味着读取文件的第一个小块。这肯定是更多的开销,然后只是检查扩展,但不是太多的工作。魔术所做的就是检查文件“看起来”就像是你想要的文件。这就像检查文件扩展名一样,只是查看内容的前几个字符而不是文件名的最后几个字符。欺骗比更改文件名更难。我建议不要使用mime类型的白名单。文件扩展名白名单应该可以满足您的需求,只需确保包含所有可能的扩展名。否则,完全有效的文件可能会被拒绝,因为它以.jpeg而不是.jpg结尾。