gpt4 book ai didi

python - 图片下载 mime 类型验证 python 请求

转载 作者:太空宇宙 更新时间:2023-11-04 02:53:53 25 4
gpt4 key购买 nike

我使用python中的requests库通过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()

此代码的潜在安全风险是什么? (我不确定我们在多大程度上可以信任服务器说响应 header 中的 MIME 类型真的是服务器所说的?)是否有更好的方法来编写安全下载例程?

最佳答案

代码的潜在安全风险取决于您对所联系的服务器的信任程度。如果您确定服务器永远不会试图用一些恶意内容来欺骗您,那么您使用那段代码就相对安全了。否则,请自行检查内容类型。最大的潜在风险可能是在不知不觉中保存了可执行文件而不是图像。较小的一个可能是存储不同类型的内容,这些内容可能会导致 PIL 或应用程序中的其他组件崩溃。

请记住,服务器可以自由地为任何响应 header 选择它想要的任何值,包括内容类型。如果您有任何理由相信您正在联系的服务器可能对此不诚实,那么您不应该相信请求 header 。

如果你想要一个更可靠的方法来确定你收到的内容的内容类型,我建议你看看python-magic ,一个 libmagic 的包装器。该库将帮助您自己确定内容类型,因此您不必“信任”您从中下载的服务器。

# ...
content = BytesIO(rsp.content)
mime = magic.from_buffer(content.read(1024), mime=True)
if mime.startswith('image'):
content.seek(0) # Reset the bytes stream position because you read from it
# ...

python-magic 有很好的文档记录,所以如果您考虑使用它,我建议您看看他们的 README。

关于python - 图片下载 mime 类型验证 python 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43048099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com