hAc*_*oCk 3 python bytesio python-imaging-library python-3.x 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()
Run Code Online (Sandbox Code Playgroud)
这段代码有什么潜在的安全风险?(我不确定我们可以在多大程度上相信服务器说响应头中的 mime 类型确实是服务器所说的?)是否有更好的方法来编写安全下载例程?
您的代码的潜在安全风险取决于您对所联系的服务器的信任程度。如果您确定服务器永远不会尝试用某些恶意内容来欺骗您,那么您使用该代码段就相对安全。否则,请自行检查内容类型。最大的潜在风险可能是在不知不觉中保存了可执行文件而不是图像。较小的一个可能是存储不同类型的内容,这可能会导致 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
# ...
Run Code Online (Sandbox Code Playgroud)
python-magic 有很好的文档记录,所以如果您考虑使用它,我建议您查看他们的自述文件。
| 归档时间: |
|
| 查看次数: |
2907 次 |
| 最近记录: |