我希望用户能够通过提供 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()
。
编辑:相关答案