2009-12-11 17 views
7

私はファイルのアップロードを許可するページに取り組んでいます。理論的には、 が私に送信するファイルが大きすぎる( の応答の長さを見て)ことを検出し、アップロードの受け入れを拒否すると、 がHTTP 413 "要求エンティティが大きすぎます"エラー。mod_perlでHTTP POSTリクエストのサイズを制限するにはどうしたらいいですか?

しかし、それは単にそれを行うことは十分ではないようです - それは私のエラーページを表示する前にFirefoxは、 少なくとも、まだ、( 長い時間がかかることがあります)、ファイルの残りを送り続けるでしょう。

HTTP specには、次のように記載されています。 "クライアントが リクエストを続行できないように接続を切断することがあります。"しかし、 'close STDIN'、 'STDIN、0'のシャットダウン、またはその一部の変形は、 トリックを実行していないようです - Firefoxは引き続きファイルを送信し続けます。

私のmod_perlハンドラが接続を閉じるとき、それは 自身とApache間の接続を閉じるだけです。 Apacheはクライアントとクライアントの間に接続を維持します( )。 Apacheに接続をシャットダウンするように指示する方法はありますか?それ以外の場合は、これはDoSベクターのような大きな のようです。

どのようなご提案も歓迎いたします。

+0

リクエストがチャンクされていると思うかもしれないので、すべてのチャンクが到着するまで要求本体のサイズを知りません。 –

答えて

6

(Perlとは対照的に)Apacheの制限機能について調べましたか? LimitRequestBodyディレクティブが大きすぎる要求をどのように取り扱っているのかはわかりませんが、少なくとも理論的には攻撃をブロックするための設定のように見えます。

1

はい、PerlがSTDINまたはSTDOUTで何をしても問題はありませんが、ApacheはCGIの状況を確認する前にアップロードを続けることができます。 STDINまたはSTDOUTまたはさらにはexit()を閉じることができます(ただし、プロセスは永続的なのでできません)。までは影響ありません。の後にPOST要求全体を受け入れます。同様に、「要求が大きすぎます」という413など、生成する可能性があるあらゆる種類のステータスヘッダーがあります。

したがって、LimitRequestBodysuggested by Pekkaとして使用するなど、特定のサイズを超えるPOST要求を拒否させる必要があります。

+0

mod_cgiとmod_perlは異なるモジュールです。 –

+0

@Alexandr:はい...?すみません、私は従いません。 –

+0

私は彼が言ったことは、mod_perlでは、投稿が完了する前にハンドラの火を持つことができるということだと思います。これにより、ダウンロードが完了するまで待機するのではなく、進行中の投稿を取り消すことができます。 – Rahly

関連する問題