8

私は現在、ユーザーがファイルをアップロードできる Web サイトに取り組んでいます。大きなファイルがアップロードされないようにするにはどうすればよいですか? その時点では、オプション (PHPpost_max_sizeおよびupload_max_filesize) は役に立ちませんでした。ファイルは完全にアップロードされます。大きすぎるファイルで接続を閉じたいだけです(Content-Length事前にHTTPヘッダーをチェックし、ファイルのアップロード中にチェックすることにより)。このための Apache ディレクティブまたは PHP 構成キーはありますか?

お時間をいただきありがとうございます!

編集: Apache confを追加しました(CentOS デフォルト)。
EDIT2: PHP conf (CentOS デフォルト) も追加しました。

EDIT3:大きすぎるファイルを指定すると、PHP がパイプを閉じるようです。それでも、Apache は終了するまで転送を許可します。

4

2 に答える 2

3

Ok。

したがって、直面している主な問題は、アップロードの完了後にApacheディレクティブLimitRequestBodyまたはLimitXMLRequestBodyが適用されることです。apacheは、サイズを確認する前に、一時フォルダー内の完全なファイルを待機しているようです。

そのため、アップロードが大きすぎることが検出された直後に接続を切断する必要があります。昔々、mod_throttleはそれを行うために利用できるモジュールでした。mod_throttle servfaultの質問に対するこの代替案をチェックすると、ニーズに合う可能性のある帯域幅制御モジュールのリストを入手できます。

たとえば、 mod_bwshareは、クライアントIPごとに帯域幅を制限できますが、これはリクエストごとのIPごとの制限ではありません。mod_quosもあり、ダウンロードに関する多くの制限を処理しますが、アップロード管理のための多くのものを見つけることができません(おそらく、早い段階で遅いアップロードを閉じるだけです)。アップロードの抑制に関するこの回答も参照してください。

したがって、OSレベルの制限(TCPスタック上)または高度なファイアウォール機能(servfaultに問い合わせる)を確認することもできます。

非表示のフォーム値やjsアップローダー設定などのクライアント側の制限ツールを使用することもできますが、クライアント側で使用されるものと同様に、セキュリティの観点から、誰かがクライアント側の制限を変更することを避けることはできません。

于 2012-08-01T12:39:35.807 に答える
2

Apache を使用できますLimitRequestBody。構文は単純です (バイト単位):

LimitRequestBody 10490000 # 10 MB

これは と の両方httpd.confで機能し.htaccessますが、編集する場合は再起動することに注意してくださいhttpd.conf( sudo service apache2 restartUbuntu の場合)。

ファイルごとに制限を設定する必要がある場合 (アバターのアップロードを 5 MB に制限し、添付ファイルを 20 MB に制限する)、以下を使用できます<Files>

<Files avatarUpload.php>
    LimitRequestBody 5242880 # 5 MB
</Files>

<Files attachmentUpload.php>
    LimitRequestBody 20971520 # 20 MB
</Files>
于 2012-08-01T07:38:24.327 に答える