我使用python中的请求库通过http下载大量的图像文件。我使用python中的BytesIO将接收到的内容转换为原始字节,然后使用Pillow()将原始内容保存为jpeg文件。在
from PIL import Image
from io import BytesIO
rsp = requests.get(imageurl)
content_type_received = rsp.headers['Content-Type'] # mime type
binarycontent = BytesIO(rsp.content)
if content_type_received.startswith('image'): # image/jpeg, image/png etc
i = Image.open(binarycontent)
outfilename = os.path.join(outfolder,'myimg'+'.jpg')
with open(outfilename, 'wb') as f:
f.write(rsp.content)
rsp.close()
此代码的潜在安全风险是什么?(我不确定我们能在多大程度上信任服务器在响应头中说mime类型实际上是服务器所说的吗?)有没有更好的方法来编写一个安全的下载例程?在
代码的潜在安全风险取决于您对所联系的服务器的信任程度。 如果你确信服务器永远不会用一些恶意内容来欺骗你,那么使用这段代码就相对安全了。 否则,请自己检查内容类型。 最大的潜在风险可能是在不知不觉中保存可执行文件而不是映像。 一个较小的方法可能是存储另一种可能导致PIL或应用程序中的其他组件崩溃的内容。在
请记住,服务器可以为任何响应头(包括内容类型)自由选择所需的任何值。 如果你有任何理由相信你联系的服务器可能不诚实,你不应该信任请求头。在
如果您想要一种更可靠的方法来确定所接收内容的内容类型,我建议您看看python-magic,libmagic的包装器。 此库将帮助您确定内容类型,因此您不必“信任”正在下载的服务器。在
pythonmagic有很好的文档记录,所以如果考虑用户的话,我建议您看看他们的自述文件。在
相关问题 更多 >
编程相关推荐