2

我希望用户能够通过提供 URL 从网络上传图像。由于可能存在 CORS 问题和防止热链接,我认为我无法让客户端获取图像并上传它,所以我让服务器来做这件事。

最大的担忧是用户简单地输入file:///home/user/secret_image.jpg。这个 URL 被发送到服务器,django 愉快地获取它,一个本地服务器端文件,托管它供全世界查看。有没有办法限制对外部资源的请求?如何使这种方法安全(至少-ish)?

其他一些问题可能是用户提供解析为本地地址的主机名或提供重定向到本地地址的公共 URL。甚至 LAN 上通常无法访问的其他设备。

过滤 URL 文本不是一种选择。在允许 urllib 继续之前,我也许可以检查 IP 是否被路由到网关并且目的地在我的子网之外。我可以阻止任何重定向,但在某些情况下这可能是一个有用的功能,因此我可以编写一个重定向处理程序来重新检查 IP。现在这开始感觉像是一个补丁工作,而不是一个很好的健壮的照顾所有情况的解决方案。

我也在做一些基本read(max_size)的事情,比如如果文件很大,使用 python-magic 检查 mimetype 并选择扩展名,使用django-ratelimit并设置调用超时urlopen()

编辑:相关答案

4

1 回答 1

0

考虑到这可能涉及大量的网络 I/O,我会将工作转移到“文件下载工作者”,例如使用Celery,但任何其他解决方案即使是本土的也可以用于这部分

文件系统

下一部分是,一旦您将主要的 Django 部署与其工作人员分开,您就可以使用不同的非特权操作系统用户来运行工作人员,您可以在chroot或其他监狱等价物内运行。这应该限制工作人员可以在其文件系统上看到的内容。

网络接口

至于网络接口,您可以设置防火墙规则,例如我相信在 Linux 操作系统上,iptables可以为每个用户和每个网络接口设置规则。因此,这应该允许您限制工作人员的用户可以在其网络上执行的操作。

底线

底线是,我会将任务转移到一个单独的工作人员中,对计算机资源具有无特权和受限的访问权限,而不是继承主 Django 应用程序的权限。给予工人的唯一特权将是访问互联网,获取一些文件,将其写回磁盘,仅此而已。

于 2015-11-02T06:45:43.843 回答