获取服务器中图片并显示,从URL获取图像并保存到服务器和/或表(ImageField)

好吧,只需获取一个图像并将其存储到文件中就很简单: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可执行文件。但这在上传场景中也很常见。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值