私はpythonでリクエストライブラリを使用して、http経由で多数のイメージファイルをダウンロードします。 PythonでBytesIOを使用して受信したコンテンツを生のバイトに変換し、この生のコンテンツをjpegファイルとして保存するためにPillow()を使用します。イメージダウンロード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タイプを推論するだけで十分ですか?好奇心の外に、要求されたものが別のタイプのメディアである場合、これはどのように決定されますか? – hAcKnRoCk
mimetypeを正確に評価するために読まなければならない適切なバイト数は、読んでいるファイルのタイプによって大きく異なるため、分かりづらいです。一部のファイルシグネチャは、この情報をオフセットとともに配置します。どのような種類の画像タイプでも十分な1024バイトが必要ですが、私はその価値が「インターネット知識」のようなものであることを認めなければなりません。 –