图片下载 MIME 类型验证 python 次请求
Image download mime type validation python requests
我使用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()
此代码的潜在安全风险是什么? (我不确定我们有多信任服务器说响应头中的 MIME 类型真的是服务器所说的?)有没有更好的方法来编写安全下载例程?
您的代码的潜在安全风险取决于您对所联系的服务器的信任程度。
如果您确定服务器永远不会试图用一些恶意内容来欺骗您,那么您使用那段代码就相对安全了。
否则,请自行检查 content-type。
最大的潜在风险可能是在不知不觉中保存了可执行文件而不是图像。
较小的一个可能是存储不同类型的内容,这些内容可能会导致 PIL 或应用程序中的其他组件崩溃。
请记住,服务器可以自由地为任何响应 headers 选择它想要的任何值,包括 content-type。
如果您有任何理由相信您正在联系的服务器可能对此不诚实,那么您不应该相信请求 headers.
如果你想要一种更可靠的方法来确定你收到的内容的内容类型,我建议你看一下 python-magic,一个 libmagic 的包装器。
该库将帮助您自己确定内容类型,因此您不必 "trust" 从中下载的服务器。
# ...
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中的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()
此代码的潜在安全风险是什么? (我不确定我们有多信任服务器说响应头中的 MIME 类型真的是服务器所说的?)有没有更好的方法来编写安全下载例程?
您的代码的潜在安全风险取决于您对所联系的服务器的信任程度。 如果您确定服务器永远不会试图用一些恶意内容来欺骗您,那么您使用那段代码就相对安全了。 否则,请自行检查 content-type。 最大的潜在风险可能是在不知不觉中保存了可执行文件而不是图像。 较小的一个可能是存储不同类型的内容,这些内容可能会导致 PIL 或应用程序中的其他组件崩溃。
请记住,服务器可以自由地为任何响应 headers 选择它想要的任何值,包括 content-type。 如果您有任何理由相信您正在联系的服务器可能对此不诚实,那么您不应该相信请求 headers.
如果你想要一种更可靠的方法来确定你收到的内容的内容类型,我建议你看一下 python-magic,一个 libmagic 的包装器。 该库将帮助您自己确定内容类型,因此您不必 "trust" 从中下载的服务器。
# ...
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。