在Django中验证已上传的文件

我正在使用的Django应用程序有一个Event模型。 一个Event可能有相关的照片,静态HTML文件和PDF文件。

我希望允许可信用户上传这些文件,但我对安全性保持警惕,特别是在Django文档(链接)中阅读了以下内容。

请注意,无论何时处理上传的文件,都应密切关注您上传的文件以及它们的类型,以避免安全漏洞。 验证所有上传的文件,以便确保文件是您认为的文件。 例如,如果您盲目地让某人上传文件(如果没有进行验证)到Web服务器文档根目录中的目录中,则有人可以上传CGI或PHP脚本,并通过访问您网站上的URL来执行该脚本。 不要容许。

我如何验证不同类型的文件? 我希望听到有人处理这类事情的经验,或者有进一步阅读的链接。 我有一种直觉,认为html文件可能太冒险了,在这种情况下,我会限制上传权限给管理员。


所有的答案都集中在验证文件上。 这几乎是不可能的。

Django开发人员并不要求您验证文件是否可以作为cgi文件执行。 他们只是告诉你不要把他们放在他们将被执行的地方。

你应该把所有的Django的东西放在一个专门的Django目录中。 该Django代码目录不应包含静态内容。 不要将用户文件放入Django源代码库中。

如果您使用的是Apache2,请查看基本的cgi教程:http://httpd.apache.org/docs/2.0/howto/cgi.html

Apache2可能被设置为运行ScriptAlias文件夹中的任何文件。 不要将用户文件放在/cgi-bin//usr/local/apache2/cgi-bin/文件夹中。

Apache2可能被设置为服务器cgi文件,具体取决于AddHandler cgi-script设置。 不要让用户提交扩展名如.cgi.pl

但是,您需要清理用户提交的文件,以便可以安全地在其他客户机的计算机上运行提交的HTML对其他用户不安全。 它不会伤害你的服务器。 你的服务器只会将它吐回到任何请求它的人。 获得一个HTML消毒器。

另外, SVG可能不安全 。 它过去有bug。 SVG是一个带有JavaScript的XML文档,因此它可能是恶意的。

PDF是...很棘手。 您可以将其转换为图像(如果您真的需要)或提供图像预览(并让用户自行下载下载),但对于试图使用它的人来说会很痛苦。

考虑一个确定的白名单文件。 嵌入在gif,jpeg或png文件中的病毒看起来就像是损坏的图片(或无法显示)。 如果你想成为偏执狂,将它们全部转换为使用PIL的标准格式(嘿,你也可以检查大小)。 消毒过的HTML应该可以(剥离脚本标记不是火箭科学)。 如果消毒过程吸吮周期(或者您只是谨慎),我想可以把它放在单独的服务器上。


对于图像,您可能只能使用Python图像库(PIL)。

Image.open(filepath)

如果文件不是图像,则会抛出异常。 我对Python / Django相当陌生,所以其他人可能有更好的验证图像的方法。


您想要处理上传的内容的第一件事是将其存储在不能直接下载的目录中。 如果您的应用存在~/www/考虑将您的数据放在'〜/ data /`中。

第二件事,你需要确定用户上传的文件类型,然后为每种文件类型创建规则。

你不能相信基于扩展名的文件,所以使用类似Fileinfo的东西。 然后为每个MIME类型创建一个验证器。 ImageMagick可以验证图像文件。 为了提高安全性,您可能需要在诸如pdf和Flash文件之类的文件上运行病毒扫描程序。 对于html,您可能需要考虑限制标签的一个子集。

我找不到Fileinfo模块的Python等价物,尽管总能执行/usr/bin/file -i 。 大多数允许上传的系统会创建一个内容名称或ID。 然后他们使用mod_rewrite来解析URL,并在磁盘上查找内容。 一旦找到内容,它就会使用sendfile或类似的东西返回给用户。 例如,在内容获得批准之前,可能只有上传该内容的用户才能查看内容。

链接地址: http://www.djcxy.com/p/46799.html

上一篇: Validating Uploaded Files in Django

下一篇: How to check type of files without extensions in python?