我使用python中的请求库通过http下载大量图像文件。我使用Python中的BytesIO将接收到的内容转换为原始字节,然后使用Pillow()将此原始内容保存为jpeg文件。图像下载MIME类型验证python请求
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类型真的是服务器说的那样)有没有更好的方法来编写安全的下载例程?
不错的答案。在我接受它之前,为什么只从响应内容读取1024个字节?因为足以从中推断出图像的MIME类型?出于好奇,如何确定所要求的是另一种类型的媒体,比如说mp4? – hAcKnRoCk
为了准确评估mimetype,您必须阅读的字节数量很难知道,因为它取决于您正在阅读的文件类型。一些文件签名甚至将这些信息与偏移量相加。对于任何类型的图像类型,1024字节都应该足够大,但我不得不承认这个值更像是“互联网知识”。 –