2

私はPythonを使用してGoogleAppEngineでWebアプリを構築していますが、ユーザーが画像をアップロードできるようにする次のコードがありますが、誰かが画像ではないものをアップロードすると、から画像のURLを作成しようとしているため、コードが壊れますデータとそれはもちろん画像ファイル以外のものを受け入れません。基本的に、画像ファイルではないファイルがアップロードされないようにする簡単な方法があるかどうかを知りたいと思いました。

class RecordPage(BlogHandler):
    def get(self, keyid, title):
        record = individual_record_cache(keyid)
        upload_url = blobstore.create_upload_url('/upload/%s' % (keyid))
        photos = []
        for blobRef in record.blobRefs:
            photos.append(images.get_serving_url(blobRef, size=None, crop=False, secure_url=None))

        global visits
        user = users.get_current_user()
        logout = users.create_logout_url(self.request.uri)       
        self.render("recordpermalink.html", user=user, logout=logout, record=record, visits=visits, photos=photos, upload_url=upload_url, keyid=keyid)

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self, record_id):
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]
        blobRef = blob_info.key()
        record = Record.get_by_id(int(record_id))
        record.blobRefs.append(blobRef)
        record.put()
        individual_record_cache(record_id, True)
        record_cache(True)
        profile_record_cache(True)
        self.redirect('/record/%s/%s' % (record_id, record.title))
4

4 に答える 4

3
  1. アップロード ハンドラーをインストールした場合、ハンドラーは BLOB が既に BLOB ストアにある後にのみ呼び出されるため、BLOB のアップロードを防ぐことはできません。ただし、BLOB を検査して削除することはできます。

  2. ブロブがアップロードされた後、次を使用して画像かどうかを確認できますImageService

    Image image = ImagesServiceFactory.makeImageFromBlob(blobKey);
    try {
        image.getFormat();
    } catch (IllegalArgumentException e) {
        // wrong image data - blob uploaded was not an image -> delete it
    }
    
于 2012-09-23T06:56:15.797 に答える
2

画像がアップロードされるか、少なくとも最初の数バイトがアップロードされるまで、画像が何であるかを知る方法はありません。

ファイル名のファイル拡張子を信頼したい場合は、次のようにすることができます。

import mimetypes
blob_mimetype = mimetypes.guess_type(blob_info.filename)[0]
# or just: blob_mimetype = blob_info.content_type
if not blob_mimetype.startswith('image/'):
    self.error(400)

コードの「分解」が何であれ、誰かが無効な画像をアップロードしたい場合、またはアップロードする前にファイルの名前を別のファイル拡張子に変更した場合、これはおそらくあなたを保護しません。これは、ほとんどの誠実なユーザーにエラーが表示されないようにする場合にのみ役立ちます。

理想的には、「コードの分解」がハンドラーコードから例外を取得することを意味する場合は、それをtry / exceptionでラップして、適切に処理できます。これはよりPython的なアプローチであり、余分な事前計算を行ったり、必要以上に賢くしようとしたりすることはありません。

于 2012-09-23T05:12:28.703 に答える
2

2つの形式のチェックを使用する必要があります(ただし、両方ともアップロードが完了した後)。まず、MIMEタイプ:「image/*」で始まることを確認してください。次に、画像ハンドラーを使用して画像を読み取ってみます。

from PIL import Image
class UploadHandler(BaseUploadHandler):
    def post(self):
    try:
        upload = self.get_uploads()[0]
        # also check mime type here
        i = Image.open(upload.open()) # open it with PIL
        w, h = i.size # make sure you can read its size
    except:
        # error stuff here, probably means it's not an image
于 2012-09-23T06:17:37.110 に答える
0

ImageMagickを使用してファイルを識別してみることができます。アップロードを完了させてから、コマンドラインツールidentifyを使用して、それが実際に画像であるかどうかを確認します。

identifyコマンドラインドキュメントへのリンクは次のとおりです。ただし、そのようなコマンドを使用することはお勧めしません。おそらくPythonMagickのようなラッパーを使用する必要があります。

編集:あなたの質問をもう一度見た後、あなたはGAEを使用しています。私はGAEのJava側の経験しかありませんが、Java GAEには実際には多くの画像処理APIがないため、Python側にもないでしょう。私が頭の中で考えることができる最善の解決策は、その作業をEC2のようなVPSに移行することです。

于 2012-09-23T05:05:16.657 に答える