2012-06-27 4 views
5

メモリを使用しているので、私は実際にはread()の操作を恐れています。たとえば、誰も1GBのファイルをアップロードして自分のサーバーをDDoSできますか?アップロードファイルのサイズをbottlepyで安全に確認するには?

name = request.forms.get('name') 
data = request.files.get('data') 
if name and data.file: 
    raw = data.file.read() # This is dangerous for big files 
    filename = data.filename 
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) 

アップロードされたファイルサイズを取得する安全な方法はありますか? 1つは、ファイルシステムからファイルサイズを取得することです。 request.files.get('data')はおそらくtempファイルのどこかに格納されていますか?

+0

apacheのようなものの下でwsgi経由でbottleを実行すると、apacheはアップロードサイズを制限できます。 – jordanm

+1

ボトルはrequest.bodyとアップロードされたすべてのファイルを、一時ファイル(または、十分な大きさの場合はByteIOバッファ)に保存します。サーバーがすべての作業を行う前にアップロードサイズを制限する場合は、request.content_lengthを確認してください。すべてがメモリに収まるようにするには、アップロードされたファイルを答えにpyfuncが記述したように、小さなチャンクで読み書きします。 – defnull

答えて

2

データのチャンクを一度に読み取ることができるかどうかを確認できますか。

これは、可能な場合:

name = request.forms.get('name') 
data = request.files.get('data') 
raw = "" 
if name and data.file: 
    while True: 
     datachunk = data.file.read(1024) 
     if not datachunk: 
      break 
     raw = raw + datachunk 

    filename = data.filename 
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) 

これが可能であれば、あなたも、あなたが読んで、超えた場合は、この操作を中止する方法大きなファイルの追跡メカニズムを追加することができるはずです。

どのようにこれはDDOSの可能な方法の1つのみを解決します。

+0

あなたのコードを修正できますか?サイズは削除する必要があります。これはTypeErrorを生成します:read()はキーワード引数をとりません。指定されたのは1024だけです。 – holms

+0

@holms:訂正してくれてありがとう。合格する名前のついた議論があると仮定しました。コードを見てみると、それは何か他に命名されるかもしれません。 – pyfunc

-3

これは興味深い質問です。通常は、ファイルオブジェクトの統計を取得するか、os.pathを使用してサイズを取得します。 This questionについては前に説明しました。

しかし、アップロードに時間を費やす前に、クライアント側のファイルサイズをサーバーからどのように伝えるかを尋ねています。私はこれを行う最善の方法はwith JavaScriptだと思います。 This questionでは、BottlePyアプリケーションにJavaScriptコードを取得する方法を紹介しています。

入力を検証するためにJavaScriptを使用して、サーバーコードでファイルが制限内にあると想定できるようにします。これを理解したら、BottlePyの人々にこれを直接BaseRequest.filesサポートに追加するように頼むことをお勧めします。

+0

'しかし、私たちがアップロードに時間を費やす前に、クライアント側のファイルサイズをサーバからどのように伝えるかを尋ねています。私はそれを覚えていません。あなたはそのフィールドを検証に合格するサイズに変更し、1GBのファイルを渡すことができます。 – holms

+0

ああ、たぶん私は誤解したかもしれない。私はあなたがDDOSに自分自身を公開することなくファイルサイズを取得したいと思った...多分私はそこに何かを仮定していた。それを行う唯一の方法は、実際にアップロードする前にファイルサイズを確認することです。ビッグファイルは既にアップロードされていますので、DDOSを阻止しませんでした。他のオプションはpyfuncの示唆のようなものですが、いくつかの制限を打ち破るためのチェックを追加します。最後のオプションは、あなたが提案して、一時ファイルの統計を取得することです。 – ChipJust

+0

@holms "そのフィールドを検証に合格するサイズに変更して1GBのファイルを渡すことができます。私はあなたのポイントを取得しません。クライアント側の検証コードを制御するので、任意のサイズを許可することができます。 – ChipJust

関連する問題