11

重複の可能性:
ユーザーが post_max_size より大きいファイルをアップロードしたかどうかを検出する方法は?

Web アプリケーションからのファイルのアップロードを処理するスクリプトを作成しています。アプリケーションにアップロードできるファイルのサイズに制限があります (ストレージ容量の制限)。私は現在、ユーザーが実際にファイルをアップロードしたことを確認する検証コードをいくつか入れようとしています。これにより、適切なエラーメッセージを表示できるようになります。しかし、ユーザーが大きすぎるファイルをアップロードした場合に、ユーザーにエラー メッセージを表示できるようにしたいとも考えています。これには Javascript を使用できますが、Javascript が有効になっていない場合に備えて PHP チェックも行いたいと思います。

PHP.ini の POST_MAX_SIZE 変数を最大ファイル アップロード サイズに設定しましたが、予期しない問題が発生しました。誰かが POST_MAX_SIZE より大きいファイルをアップロードしようとすると、バイナリ データは最大サイズで切り捨てられ、$_FILES 配列にはそのファイルのエントリが含まれません。これは、ユーザーがファイルをまったく送信しなかった場合と同じ動作です。

これにより、$_FILES 配列にファイルが含まれていない理由、つまりファイルがアップロードされていないのか、大きすぎて完全に送信できないのかを判断するのが難しくなります。

これら2つのケースを区別する方法はありますか? つまり、ファイルの POST データが送信されたが、ファイル全体が送信される前に途中で切り捨てられたかどうかを確認する方法はありますか?

4

2 に答える 2

7

奇妙に思えるかもしれませんが、これは意図的な動作であり、POST_MAX_SIZE は低レベルの究極のフェイルセーフであり、ユーザーを保護して DOS 攻撃を防ぐために、サーバーがストリームの途中で、安全に処理できる以上のデータを受信して​​います。一度にこれよりも多くのデータを受信する必要があることがわかっている場合は、この値を上げることができます (ただし、サーバーにかかる負荷の増加をサーバーが処理できることを確認してください)。ただし、ユースケースを処理する他の方法を検討することをお勧めします。 POST_MAX_SIZE にぶつかると、たとえば、複数の AJAX 呼び出しに分割するなど、1 つの大規模な HTTP POST よりも堅牢なソリューションがある可能性があることが示唆されます。

POST_MAX_SIZE とは別に、単一ファイル制限の php.ini 設定である UPLOAD_MAX_SIZE があります。これは、最初に話していたと思います。アップロードされるファイルのサイズを制限し、ファイルがこの値を超えると、に設定さ$_FILES['file']['error']1ます。一般的に言えば、サイトを次のように設定する必要があります。

  • MAX_FILE_SIZE は、この<form>フォームで実際に受け入れたい最大値に設定する必要があります。あなたのサイトを悪用しようとするユーザーはこれを回避できますが、実際にあなたのサイトを使用しているユーザーにとっては良いことです。ブラウザーは、サイトをアップロードしようとして帯域幅を浪費するのを防ぐことができるからです。これは常に、サーバー側の設定よりも小さくする必要があります。
  • UPLOAD_MAX_FILESIZEは、サーバーが受け入れる最大サイズであり、それより大きいものは破棄し、$_FILESアレイにエラーを報告します。これは、サイト全体で実際に受け入れる最大のファイルよりも大きくする必要があります。
  • POST_MAX_SIZEは、サーバーが 1 回の POST リクエストで受け入れることができるデータの最大量です。大規模なアップロードを成功させるには、これを UPLOAD_MAX_SIZE よりも大きくする必要があり、一度に複数のファイルをアップロードできるようにするには、さらに大きくする必要があります。UPLOAD_MAX_FILESIZE * 4.1 の値をお勧めします。これにより、一度に 4 つの大きなファイルと、少し余分なデータが許可されます。もちろん、YMMV であり、設定した値が何であれ、サーバーが適切に処理できることを確認する必要があります。

どのように伝えるかについての特定の質問に対して、 POST_MAX_SIZE に関する PHP ドキュメントにリンクして、フォームで get 変数を設定することを提案しました。

<form action="edit.php?processed=1">

ただし、上で述べたように、この問題が発生した場合は、別のアップロード方法を検討することをお勧めします。

于 2012-07-13T18:51:49.230 に答える
6

このようなもの:

if ($_SERVER['CONTENT_LENGTH'] && !$_FILES && !$_POST) {
  // upload failed
}

テストされていないため、さまざまなシナリオを試して、どの組み合わせが機能するかを確認してください。同時に複数のファイルをアップロードできるかどうかは不明です。

$_SERVER['CONTENT_LENGTH']複数のアップロードを処理する場合は、それを調べて、受信したファイルの合計と比較する必要がある場合があります。

于 2012-07-13T18:58:21.990 に答える