好吧,只需获取一个图像并将其存储到文件中就很简单:import urllib2
with open('/path/to/storage/' + make_a_unique_name(), 'w') as f:
f.write(urllib2.urlopen(your_url).read())
然后,您需要配置您的Web服务器来服务该目录中的文件。在
但这会带来安全风险。在
恶意用户可能会出现并键入一个不指向任何地方的URL。或者指向他们自己的邪恶服务器,它接受你的连接但从不响应。这是典型的denial of service攻击。在
一个天真的解决办法可能是:
^{pr2}$
但是,对手可以构建一个服务器,它接受连接,并且每秒钟无限期地写出一行,从不停止。timeout没有涵盖这一点。在
因此,一个合适的解决方案是运行a task queue,同时使用timeouts,以及经过仔细选择的工人数量,所有这些都严格独立于面向Web的进程。在
另一种攻击是将您的服务器指向某个私有的东西。为了举例说明,假设您有一个运行在端口8000上的内部管理站点,它对于外部世界来说是不可访问的,但是您自己的进程可以访问它。然后我可以输入http://localhost:8000/path/to/secret/stats.png并查看所有有价值的秘密图,甚至可以修改一些内容。这被称为server-side request forgery或SSRF,防御起来不是一件小事。您可以尝试解析URL并对照黑名单检查主机名,或者显式解析主机名并确保它不指向任何计算机或网络(包括127.0.0.0/8)。在
当然,还有一个问题,就是验证接收到的文件是否是图像,而不是HTML文件或Windows可执行文件。但这在上传场景中也很常见。在