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

2024-05-29 10:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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类型实际上是服务器所说的吗?)有没有更好的方法来编写一个安全的下载例程?在


Tags: fromimageimport内容typeopencontentjpeg
1条回答
网友
1楼 · 发布于 2024-05-29 10:23:31

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

请记住,服务器可以为任何响应头(包括内容类型)自由选择所需的任何值。 如果你有任何理由相信你联系的服务器可能不诚实,你不应该信任请求头。在

如果您想要一种更可靠的方法来确定所接收内容的内容类型,我建议您看看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
    # ...

pythonmagic有很好的文档记录,所以如果考虑用户的话,我建议您看看他们的自述文件。在

相关问题 更多 >

    热门问题