繁体   English   中英

服务器端urllib2.urlopen和用户的url的安全注意事项

[英]Security considerations with server side urllib2.urlopen with url from user

我希望用户能够通过提供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()的调用超时。

编辑: 相关答案

鉴于这可能涉及大量的网络I / O,因此我将工作移到了“文件下载工作者”,例如使用Celery ,但是即使是本地出产的任何其他解决方案也都可以做到这一点

文件系统

下一部分是,一旦您将主要的Django部署与其工作人员分开,则可以使用另一个没有特权的OS用户来运行该工作人员,您可以在chroot或其他监狱环境中运行该工作人员。 这将限制工作人员在其文件系统上看到的内容。

网络接口

至于网络接口,您可以设置防火墙规则,例如,我相信在Linux OS上, iptables可以为每个用户和每个网络接口设置规则。 这样一来,您就可以限制工作人员的用户可以在其网络上执行的操作。

底线

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM