python - 使用来自用户的 url 的服务器端 urllib2.urlopen 的安全注意事项

标签 python django security urllib2 ssrf

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

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

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

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

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

编辑:related answer

最佳答案

鉴于这可能涉及大量网络 I/O,我会将工作转移到“文件下载 worker ”,例如与 Celery ,但任何其他解决方案,甚至是本土解决方案都可以解决这个问题

文件系统

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

网络接口(interface)

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

底线

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

关于python - 使用来自用户的 url 的服务器端 urllib2.urlopen 的安全注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462275/

相关文章:

javascript - 用户从下拉列表中选择选项后如何更改 url 值

django - 带有父 url 参数的自定义 Django 管理站点

django - 如何将分页与基于 Django 类的通用 ListView 一起使用?

php "include()"安全漏洞?

python - 在Python中对包含数字的字符串列表进行排序

python - python中的[None]和[]有什么区别?

python - 如何接受来自 pygame GUI 的文本输入

javascript - Django 模板,在 javascript post 后重新加载

asp.net - asp.net mysql 安全性是否还需要其他方库作为提供者

security - 创建一个开发服务器,就像让我们加密一样