8

ファイルのアップロードを受け入れるページで作業しています。理論的には、送信されたファイルが大きすぎる場合は(応答のContent-Lengthを確認することで)検出​​でき、アップロードの受け入れを拒否して、HTTP413の「RequestEntityTooLarge」エラーを返します。

ただし、それだけでは不十分なようです。少なくともFirefoxは、エラーページが表示される前に、ファイルの残りの部分を送信し続けます(これには長い時間がかかる可能性があります)。

HTTP仕様では、「クライアントがリクエストを続行できないように、接続を閉じることができます」と記載されています。ただし、「STDINを閉じる」、「STDINをシャットダウンする、0」、またはその変形のいずれかを実行しても、うまくいかないようです。Firefoxは引き続きファイルを送信します。

私のmod_perlハンドラーが接続を閉じるとき、それはそれ自体とApacheの間の接続を閉じているだけだと思います。Apacheは、Apacheとクライアント間の接続を維持します。Apacheに接続をシャットダウンするように指示する方法はありますか?そうでなければ、これは素晴らしいDoSベクトルのようです。

任意の提案を歓迎します。

4

2 に答える 2

7

(Perlではなく)Apacheの制限機能を調べましたか?ディレクティブが大きすぎるリクエストをどのように処理するかについては詳しくわかりませんLimitRequestBodyが、少なくとも理論的には、攻撃をブロックするように設計された設定のように見えます。

于 2009-12-11T20:21:14.643 に答える
2

STDINはい、Perlが何を処理するかは関係ありません。またSTDOUT、Apacheは、CGIで何が発生するかをチェックする前に、アップロードを続行することを許可します。閉じることも、あるいは閉じることもSTDINできますが(ただし、プロセスは永続的であるため、これを行うことはできません)、 ApacheがPOSTリクエストを完全に受け入れ終わるまでそのいずれも効果がありません。同様に、「リクエストが大きすぎます」など、生成する可能性のあるあらゆる種類のステータスヘッダーを使用します。STDOUTexit()413

したがって、これを機能させるには、たとえばPekkaによって提案されLimitRequestBodyているように、Apacheに特定のサイズを超えるPOST要求を拒否させる必要があります。

于 2009-12-11T21:12:07.350 に答える