我使用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字節都應該足夠大,但我不得不承認這個值更像是「互聯網知識」。 –