在Django中验证上传的文件

Ala*_*air 22 python security django file-upload

我工作的Django应用程序有一个Event模型.一个Event可能有关联的照片,静态HTML文件和PDF文件.

我想允许受信任的用户上传这些文件,但我对安全性很警惕,特别是在Django文档(链接)中阅读了以下内容.

请注意,无论何时处理上传的文件,都应密切关注上传文件的位置以及文件的类型,以避免安全漏洞.验证所有上传的文件,以确保文件符合您的认可.例如,如果您盲目地让某人将文件上传到Web服务器文档根目录中的目录而无需验证,那么有人可以上传CGI或PHP脚本并通过访问您站点上的URL来执行该脚本.不要允许.

如何验证不同类型的文件?我很想听听任何人处理这种事情的经历,或者是进一步阅读的链接.我有一种直觉,认为html文件风险太大,在这种情况下我会限制管理员的上传权限.

wis*_*sty 17

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

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可能不安全.它过去有虫子.SVG是一个带有javascript的XML文档,因此它可能是恶意的.

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

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

  • 使用单独的域是最安全的.这样,如果有人走私一个既作为图像内容又作为脚本内容的文件,它将不具有同源特权. (3认同)

Mat*_*ick 14

对于图像,您可以只使用Python Imaging Library(PIL).

Image.open(filepath)
Run Code Online (Sandbox Code Playgroud)

如果文件不是图像,则抛出异常.我是Python/Django的新手,所以其他人可能有更好的方法来验证图像.

  • django.forms包含一个自动为您进行验证的ImageField. (9认同)

bri*_*gge 6

您要对上传的内容做的第一件事是将其存储在无法直接下载的目录中.如果您的应用程序存在,请~/www/考虑将数据放在'〜/ data /`中.

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

您无法信任基于扩展名的文件,因此请使用类似Fileinfo的内容.然后,对于每个mime类型,创建一个验证器.ImageMagick可以验证图像文件.为了提高安全性,您可能必须在pdf和flash文件等文件上运行病毒扫描程序.对于html,您可能需要考虑限制标记的子集.

我找不到与Fileinfo模块相同的Python ,尽管它总是可以执行/usr/bin/file -i.大多数允许上传的系统会创建内容名称或ID.然后,他们使用mod_rewrite来解析URL,并在磁盘上查找内容.找到内容后,会使用sendfile或类似内容将其返回给用户.例如,在内容被批准之前,可能只允许上传它的用户查看它.


Jia*_*aro 5

这有点特定于您的托管环境,但这是我做的:

使用Nginx而不是apache为所有用户上传的内容提供服务,并将其全部作为静态内容提供(即使用户上传它也不会运行任何php或cgi)