PHP 5.6.0 released

陥りやすい落とし穴

MAX_FILE_SIZE の値に、php.iniupload_max_filesize で指定されたファイルサイズより大きなファイルサイズを指定する ことはできません。デフォルトは、2 メガバイトです。

メモリ制限が有効な場合、memory_limit の値をより大きく 設定することが必要となる可能性があります。 memory_limit に充分大きな 値を設定するようにしてください。

max_execution_time に設定した値が小さすぎた場合、スクリプトの実行時間がこの値を越える 可能性を生じます。 max_execution_time に充分大きな値を設定するように してください。

注意: max_execution_time はスクリプト自身の実行時間にのみ影響します。 スクリプトの実行範囲の外側で発生する動作にかかる時間、つまり、 system() を使ったシステムコールや、 sleep() 関数、データベースに対するクエリー、 ファイルアップロードプロセス、などに費やされた時間はスクリプトの 総実行時間に含まれません。

警告

max_input_time は、スクリプトで入力を受け付けることができる最大秒数を設定します。 この秒数には、ファイルアップロードの時間も含まれます。 大きなファイルや複数のファイルをアップロードしたり接続に時間を要したりする場合は、 デフォルト値の 60 seconds を増やしましょう。

post_max_size の設定値が 小さすぎた場合、大きなファイルをアップロードすることができなくなります。 post_max_size に充分大きな値を設定するように してください。

PHP 5.2.12 以降、 max_file_uploads は一回のリクエストあたりでアップロードできるファイルの数の制限値となります。 この制限を超える数のファイルをアップロードしようとすると、制限に達した時点で $_FILES は処理を停止します。たとえば max_file_uploads10 の場合には、$_FILES には 10 件までの要素しか入らないということです。

処理するファイルを検証しない場合、ユーザーが他のディレクトリにある 非公開情報にアクセスできる可能性を生じます。

CERN httpd は、クライアントから得た content-type MIME ヘッダにおいて最初が空白文字で始まるものを切り捨てるようですので注意してください。 このような動作をする限り、CERN httpdは、 ファイルアップロード機能をサポートしないでしょう。

大量のディレクトリ一覧のスタイルのせいで、 風変わりな名前(空白を含んでいるとか)のファイルを適切に扱えることは 保証できません。

通常の input フィールドとファイルアップロードフィールドを (input の name に foo[] を利用するなどして) 同一のフォーム変数で扱うことはできません。

add a note add a note

User Contributed Notes 10 notes

up
1
Nirmal Natarajan
4 years ago
If using IIS 7.0 or above, the Request Filtering is enabled by default and the max allowed content length is set to 30 MB.

One must change this value if they want to allow file uploads of more than 30 MB.

Sample web.config entry:

<configuration>
    </system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="314572800"/>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

The above setting will allow 300 MB of data to be sent as a request. Hope this helps someone.
up
0
dg at artegic dot de
4 years ago
In case of non-deterministic occurence of the UPLOAD_ERR_PARTIAL error:  The HTTPD (e.g. Apache) should respond with a 'Accept-Ranges: none' header field.
up
0
anders jenbo pc dk
6 years ago
A responce to admin at creationfarm dot com, Mac OS X and Windows running on a NTFS disk also uses a multi stream file system. Still only the data stream in transfared on http upload. It is preferable to pack Mac OS X files in .dmg files rathere then zip but the avarage user will find zip much easir and they are supported on more platforms.
up
0
tjaart at siam-data-services dot com
9 years ago
Took me a while to figure this one out...

I think this is actually a header problem, but it only
happens when doing a file upload.

If you attept a header("location:http://...) redirect after
processing a $_POST[''] from a form doing a file upload
(i.e. having enctype="multipart/form-data"), the redirect
doesn't work in IE if you don't have a space between
location: & http, i.e.
header("location:http://...)  vs
header("location: http://...)

===================================
<?php
if ($_POST['submit']=='Upload') {
   
// Process File and the redirect...
   
header("location: http://"..."/somewhere.php");
    exit;
}
?>
<html><head></head><body>
<form enctype="multipart/form-data" action="upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="20000">
    Your file: <input name="filename" type="file">
    <input name="submit" type="submit" value="Upload">
</form>
</body></html>
===================================

This only happens if all of the following are true:
header("location:http://...) with no space
Form being processed has enctype="multipart/form-data"
Browser=IE

To fix the problem, simply add the space.

Hope this helps someone else.
up
0
amalcon _a_t_ eudoramail _d_o_t_ com
10 years ago
Note that, when you want to upload VERY large files (or you want to set the limiters VERY high for test purposes), all of the upload file size limiters are stored in signed 32-bit ints.  This means that setting a limit higher than about 2.1 GB will result in PHP seeing a large negative number.  I have not found any way around this.
up
0
morganaj at coleggwent dot ac dot uk
10 years ago
Here is another that may make your upload fall over.  If you are using Squid or similar proxy server make sure that this is not limiting the size of the HTTP headers. This took me weeks to figure out!
up
0
tomcashman at unitekgroup dot com
11 years ago
For apache, also check the LimitRequestBody directive.
If you're running a Red Hat install, this might be set in /etc/httpd/conf.d/php.conf.
By default, mine was set to 512 KB.
up
0
sebastian at drozdz dot ch
11 years ago
It's important that the variable 'open_basedir' in php.ini isn't  set to a directory that doesn't not includes tempupload directory
up
0
admin at creationfarm dot com
11 years ago
The macintosh OS (not sure about OSx) uses a dual forked file system, unlike the rest of the world ;-). Every macintosh file has a data fork and a resource fork. When a dual forked file hits a single forked file system, something has to go, and it is the resource fork. This was recognized as a problem (bad idea to begin with) and apple started recomending that developers avoid sticking vital file info in the resource fork portion of a file, but some files are still very sensitive to this. The main ones to watch out for are macintosh font files and executables, once the resource fork is gone from a mac font or an executable it is useless. To protect the files they should be stuffed or zipped prior to upload to protect the resource fork.

Most mac ftp clients (like fetch) allow files to be uploaded in Macbinhex, which will also protect the resource fork when transfering files via ftp. I have not seen this equivilent in any mac browser (but I haven't done too much digging either).

FYI, apple does have an old utility called ResEdit that lets you manipulate the resource fork portion of a file.
up
-1
oliver dot schmidt at drehsinn dot de
7 years ago
If you want to use open_basedir for securing your server (which is highly recommended!!!) remember to add your tmp dir to the open_basedir value in php.ini.

Example: open_basedir = <your htdocs root, etc...>:/tmp

(Tested on gentoo Linux, Apache 2.2, PHP 5.1.6)
To Top