web-dev-qa-db-ja.com

HTMLアップロードMAX_FILE_SIZEが機能していないようです

MAX_FILE_SIZEという名前の隠しフィールドはどのように機能するのでしょうか?

<form action="" method="post" enctype="multipart/form-data">
    <!-- in byes must preceed file field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
    <input type="file" name="upload" />

    <input type="submit" name="submit" value="Submit" />
</form>

4MB以上のファイルをアップロードしましたが、クライアント側から警告が表示されません(サーバー側の話ではありません)。 MAX_FILE_SIZEとはどういうことですか?

[〜#〜] update [〜#〜]

[OK]ので、PHPは「ソフト」制限を課します。しかし、それを使用することとコードで$_FILES['upload']['size'] < 2000のようなものをチェックすることとの間に違いはありますか?

36
JM at Work

_MAX_FILE_SIZE_は KBではない バイト。あなたは正しかった、それはバイト単位です。そのため、4MBの制限でconvert 4MB in bytes {1024 * (1024 * 4)}を試してください:

_<input type="hidden" name="MAX_FILE_SIZE" value="4194304" /> 
_

enter image description here

アップデート1

他の人が説明したように、これについて警告を受け取ることはありません。サーバー側にソフト制限を課すためだけにあります。

更新2

あなたのサブ質問に答えるために。はい、違いがあります。ユーザー入力を決して信用しないでください。常に制限を課す場合は、常にそのサイズを確認する必要があります。 _MAX_FILE_SIZE_の動作を信頼しないでください。ユーザーが変更できるためです。それで、はい、あなたはそれが常にあなたが望むサイズ以上であることを確認するためにチェックする必要があります。

違いは、2MBの_MAX_FILE_SIZE_を課し、ユーザーが4MBファイルをアップロードしようとすると、アップロードの最初の約2MBに達すると転送が終了し、PHPそのファイルのデータの受け入れを停止します。ファイル配列のエラーを報告します。

43
Shef

始める前に、ファイルのサイズをサーバー側で確認する必要があることを強調してください。サーバー側でチェックされていない場合、悪意のあるユーザーはクライアント側の制限を上書きし、巨大なファイルをサーバーにアップロードできます。ユーザーを信用しないでください。

PHPのMAX_FILE_SIZEを少し試してみましたが、ファイルがアップロードされて初めて機能するように見えたため、無関係になりました(悪意のあるユーザーが簡単に上書きできます)。

Matthewの投稿 に基づいた以下のJavaScriptコード(FirefoxおよびChromeでテスト済み)は、ユーザー(良い、罪のない人)にアプリを警告し、トラフィックとユーザーの時間の両方を節約します。 :

<form method="post" enctype="multipart/form-data" 
onsubmit="return checkSize(2097152)">    
<input type="file" id="upload" />
<input type="submit" />
<script type="text/javascript">
function checkSize(max_img_size)
{
    var input = document.getElementById("upload");
    // check for browser support (may need to be modified)
    if(input.files && input.files.length == 1)
    {           
        if (input.files[0].size > max_img_size) 
        {
            alert("The file must be less than " + (max_img_size/1024/1024) + "MB");
            return false;
        }
    }

    return true;
}
</script>
40
Roei Bahumi

簡単にアップロードできるファイルとそうでないファイルについて不思議に思っていた人にとっては、サイズの問題かもしれません。 PHPコードで大きなファイルをアップロードせず、Excelファイルをアップロードしていないと仮定していたため、これを共有しています。そのため、PHPを使用していて、ファイルのアップロード制限を増やしたい場合は、php.iniファイルに移動して、次の変更を行います。

  • upload_max_filesize = 2M

に変更される

  • upload_max_filesize = 10M

  • post_max_size = 10M

または必要なサイズ。次に、Apacheサーバーを再起動すると、アップロードが魔法のように動作し始めます。これが誰かの助けになることを願っています。

7
Nandakishore

実際には、実際には機能しません。マニュアルページのコメントのいずれかで説明を見つけることができます: http://www.php.net/manual/en/features.file-upload.php#74692

更新された質問への回答:明らかな違いは、サーバー側のチェックは信頼できるが、クライアント側のチェックは信頼できないことです。

4

MAX_FILE_SIZE隠しフィールドに関するPHP.netの説明

MAX_FILE_SIZE隠しフィールド(バイト単位で測定)はファイル入力フィールドの前にある必要があり、その値はPHPが受け入れる最大ファイルサイズです。このフォーム要素は常に使用する必要があります。これは、サイズが大きすぎて転送が失敗したことを確認するためだけに、大きなファイルが転送されるのを待つ手間を省くためです。留意してください:ブラウザ側でこの設定をだますのは非常に簡単なので、この機能によってブロックされているより大きなサイズのファイルに依存しないでください。これは、アプリケーションのクライアント側のユーザーにとって便利な機能にすぎません。ただし、maximum-sizeのPHP設定(サーバー側))はだまされません。

http://php.net/manual/en/features.file-upload.post-method.php

3
SandroMarques

情報をサーバーに送信するだけです。ファイルフィールドに先行しなければならない理由は、サーバーがリクエストを使用してアップロードのサイズをチェックできるようにするには、ファイルペイロードの前に来る必要があるためです。

サーバーでの値の使用方法は、アップロードの処理に使用するものによって異なります。コードは、特にその値を探す特定のアップロードコンポーネントを対象としています。

組み込みのアップロードサポート in PHPは、このフィールド値を使用するためのものです。

3
Guffa

ISクライアント側の非表示フォームフィールドMAX_FILE_SIZEを導入する際のポイント。

php.iniは、アップロードされるファイルのサイズを制限できます。したがって、スクリプトはphp.iniによって課せられた制限を順守しますが、異なるHTMLフォームはアップロードされるファイルサイズをさらに制限できます。そのため、ビデオをアップロードする場合、フォームは最大サイズを10 MBに制限する場合があり*、写真をアップロードする場合、フォームは1 MBの制限を設ける場合があります。同時に、最大制限をphp.iniで設定して、これをすべて許可するために10MBを想定できます。

これは何をすべきかをサーバーに伝える簡単な方法ではありませんが、それでも役立ちます。

  • HTMLは何も制限しません。 MAX_FILE_SIZEとその値を含むすべてのフォーム変数をサーバーに転送するだけです。

それが誰かを助けることを願っています。

1
Hamid Sarfraz