正在验证Djang中上载的文件

2024-04-25 21:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发的Django应用程序有一个Event模型。Event可能有关联的照片、静态html文件和pdf文件。

我想允许受信任的用户上传这些文件,但我对安全性很谨慎,特别是在阅读了下面的in the Django docs(链接)之后。

Note that whenever you deal with uploaded files, you should pay close attention to where you're uploading them and what type of files they are, to avoid security holes. Validate all uploaded files so that you're sure the files are what you think they are. For example, if you blindly let somebody upload files, without validation, to a directory that's within your Web server's document root, then somebody could upload a CGI or PHP script and execute that script by visiting its URL on your site. Don't allow that.

如何验证不同类型的文件?我想听听任何人处理这种事情的经验,或进一步阅读的链接。我有一种直觉,html文件可能太危险,在这种情况下,我将限制管理员的上传权限。


Tags: and文件thetodjangoreyouevent
3条回答

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

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应该没问题(去掉脚本标记不是火箭科学)。如果卫生处理是消耗周期(或者你只是很谨慎),我想你可以把它放在一个单独的服务器上。

对于图像,您可以只使用Python Imaging Library(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或类似的方法将其返回给用户。例如,在内容被批准之前,可能只有上传内容的用户才允许查看它。

相关问题 更多 >

    热门问题