-1

我没有看到太多关于此的文档。我正在尝试从 URL 将图像上传到服务器。理想情况下,我想让事情变得简单,但我对使用 ImageField 是最好的方法还是更简单地简单地将文件存储在服务器上并将其显示为静态文件有两种看法。我没有上传任何文件,所以我需要获取它们。在我尝试重新发明轮子之前,任何人都可以提出任何体面的代码示例吗?

给定一个 URL 说http://www.xyx.com/image.jpg,我想将该图像下载到服务器,重命名后将其放入合适的位置。我的问题很笼统,因为我正在寻找人们已经做过的事情的例子。到目前为止,我只看到与上传图像有关的示例,但这并不适用。这应该是一个简单的案例,我正在寻找一个可能有帮助的规范示例。

这是用于从用户上传图像:Django: Image Upload to the Server

那么是否有任何示例仅处理在服务器和/或 ImageField 上获取和存储图像和存储的过程。

4

1 回答 1

2

好吧,只是获取图像并将其存储到文件中很简单:

import urllib2
with open('/path/to/storage/' + make_a_unique_name(), 'w') as f:
    f.write(urllib2.urlopen(your_url).read())

然后,您需要配置您的 Web 服务器以提供该目录中的文件。

但这也带来了安全风险

恶意用户可能会出现并键入一个无处指向的 URL。或者指向他们自己的邪恶服务器,它接受你的连接但从不响应。这将是典型的拒绝服务攻击。

一个天真的修复可能是:

urllib2.urlopen(your_url, timeout=5)

但随后攻击者可以构建一个接受连接的服务器,并无限期地每秒写出一行,永不停止。timeout不包括那个。

所以一个合适的解决方案是运行一个任务队列,也有超时,以及精心选择的工作人员数量,所有这些都严格独立于你的面向 Web 的进程。

另一种攻击是将您的服务器指向私人的东西。例如,假设您有一个在端口 8000 上运行的内部管理站点,外部世界无法访问它,但您自己的进程可以访问它。然后我可以输入http://localhost:8000/path/to/secret/stats.png并查看你所有有价值的秘密图,甚至可以修改一些东西。这被称为服务器端请求伪造或 SSRF,防御起来并非易事。您可以尝试解析 URL 并根据黑名单检查主机名,或显式解析主机名并确保它不指向您的任何机器或网络(包括 127.0.0.0/8)。

当然,还有一个问题是验证您收到的文件实际上是图像,而不是 HTML 文件或 Windows 可执行文件。但这对于上传场景也很常见。

于 2013-09-20T21:10:19.470 回答