2012-01-23 12 views
4

私はファイルアップロードを処理する最良の方法を理解しようとしています安全にをwsgiアプリケーションで使用しています。フォームデータを解析するために、cgiモジュールからFieldStorageを使用することが多くの解決策であるようです。私がFieldStorageについて理解していることから、データを一時ファイルにストリーミングすることによって、舞台裏で少しの「魔法」を実行します。wsgiで大きなファイルのアップロードを制限するにはどうすればよいですか?

私が100%明確ではないのは、指定された量(たとえば10MB)を超えるファイルを含む要求を制限する方法です。誰かが数GBのファイルをアップロードした場合は、サーバーのディスク容量を十分に掘り下げる前に、要求をブロックすることは明らかです。

wsgiアプリケーションでファイルアップロードを制限する最良の方法は何ですか?

+0

この質問は 'wsgi'とタグ付けされています。 WSGIインターフェイスを直接使用していますか?もしそうなら、 'environ ['wsgi.input']'から読み取ったデータの量を制御する(そして 'Content-Length'ヘッダをチェックする)ケーキの一部でなければなりません。 –

答えて

3

フロントエンドサーバーによって異なります。アプリに入る前から大きなリクエストをブロックする設定がある場合は、それを使用してください。

  • ルックは、Content-Length HTTPヘッダーを食べた:あなたはあなたのコードでこれをブロックしたい場合は

    は、私は2つのアプローチを参照してください。あなたが処理できるよりも大きければ、すぐにリクエストを拒否してください。

  • 制限に達するまで、ヘッダーを信頼せずにリクエスト本文の読み取りを開始しないでください。これは非常に巧妙な方法ではありませんが、うまくいくことに注意してください。 =)

HTTPヘッダーを信頼すると、いくつかの問題が発生する可能性があります。何人かがContent-Length:1024でリクエストを送信するが、1GBのリクエストボディを送る。フロントエンドサーバーがヘッダーを信頼する場合は、この要求の読み取りを開始し、後で要求本文が実際にははるかに大きいことがわかります。この状況は、サーバーディスクをいっぱいにする可能性があります。

これが起こる可能性がありますが、私はヘッダーを信頼することが良い出発点になると思います。

+1

HTTPサーバーが間違った 'Content-Length'状況を処理するべきではありませんか? HTTP/1.1準拠の実装では余分なコンテンツを拒否しなければならないと思っていました。さらに、HTTPキープアライブを実装したい場合は、これを行う必要があります(そうしないと、次のリクエストの開始時期を知る方法がありません)。 –

+0

あなたはそうです!しかし、とにかくリクエストが実際にContent-Lengthヘッダーの値よりも大きいときを見つけるのは難しいかもしれません。 サーブはContent-Length + 1バイトに達するまで要求を読み取る必要がありますが、これを行うにはよりスマートな方法があります。 –

+0

ヘッダーを抽出し、要求本体をソケットからWSGIアプリケーションに転送する必要があるため、サーバーはすでに要求を読み取ります。また、サーバーはHTTP/1.1であると主張できません。チェックが行われない場合は準拠します。 –

0

おそらくWSGIアプリケーションの前にあるHTTPサーバーの機能を使用できます。たとえば、lighttpdはmany options for traffic shapingです。

関連する問題