web-dev-qa-db-ja.com

Python PILイメージ検証はなしを返します

APIからJPGを取得して処理するツールを開発しています。画像のソースが信頼できないため、画像が有効なJPG(許可されている唯一の画像タイプ)であるかどうかをテストしたいと思います。

修正できないPILのエラーが発生しました。以下は私のコードです:

image = StringIO(base64.b64decode(download['file']))
img = Image.open(image)
if img.verify():
    print 'Valid image'
else:
    print 'Invalid image'

ただし、img.verify()はNoneを返すようです。サイズを返すimg.size()のように、開いている画像で他の関数を呼び出すことができます。コードをデバッグしようとすると、次の出力が得られます。

img = Image.open(image)
print img
print img.size()
print img.verify()

[2018-01-09 20:56:43,715: WARNING/Worker-1] <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2577x1715 at 0x7F16E17DC9D0>
[2018-01-09 20:56:43,716: WARNING/Worker-1] (2577, 1715)
[2018-01-09 20:56:43,716: WARNING/Worker-1] None

誰かが同じ問題に遭遇しましたか?

5
nobody

ドキュメントによると、 Image#verify (または verifyのPILドキュメント )は、イメージに問題がある場合に例外を発生させ、それ以外のことは何もしません。

#verifyを使用するには、おそらく次のようなものが必要です。

image = StringIO(base64.b64decode(download['file']))
img = Image.open(image)
try:
    img.verify()
    print('Valid image')
except Exception:
    print('Invalid image')

さらに、 画像形式 :を見て、画像が実際にJPGであることも確認することをお勧めします。

if img.format == 'JPEG':
     print('JPEG image')
else:
     print('Invalid image type')
8
supersam654

verify.formatフィールドのチェックに加えて、信頼できない(そしておそらく本当に悪意のある)ソースからWeb経由で画像をロードする場合は、 Zip bombs について心配する必要があります。 =。

枕(元のPILではないと思います)にはDecompressionBombWarningがあり、画像がImage.MAX_IMAGE_PIXELS(画像を読み込もうとする前に自分で設定できる値)を超えようとするとトリガーされます。私のインストールでは、そのデフォルト値は非常に寛大な85Mピクセルです。

この枕機能についてのより完全な議論は この議論 にあります。

3
Finlay McWalter