PHP Conference Japan 2024

常见陷阱

The MAX_FILE_SIZE 项不能指定大于在 upload_max_filesize 中设置的文件大小的文件大小 php.ini 文件。默认值为 2 MB。

如果启用了内存限制,则可能需要更大的 memory_limit。确保您设置了足够大的 memory_limit

如果 max_execution_time 设置得太小,则脚本执行可能会超过该值。确保您设置了足够大的 max_execution_time

注意 max_execution_time 仅影响脚本本身的执行时间。发生在脚本执行之外的任何活动所花费的时间,例如使用 system() 的系统调用,sleep() 函数,数据库查询,文件上传过程花费的时间等,在确定脚本已运行的最大时间时不包括在内。

警告

max_input_time 设置脚本允许接收输入的最大时间(以秒为单位);这包括文件上传。对于大型或多个文件,或连接速度较慢的用户,默认的 60 秒可能会超过。

如果 post_max_size 设置得太小,则无法上传大文件。确保您设置了足够大的 post_max_size

The max_file_uploads 配置设置控制可以在一个请求中上传的文件的最大数量。如果上传的文件数量超过限制,则 $_FILES 将在达到限制后停止处理文件。例如,如果 max_file_uploads 设置为 10,则 $_FILES 将永远不会包含超过 10 个项目。

不验证您操作的文件可能意味着用户可以访问其他目录中的敏感信息。

由于目录列表样式数量众多,我们无法保证具有奇特名称(例如包含空格)的文件得到正确处理。

开发人员不能在同一个表单变量中混合使用普通的 input 字段和文件上传字段(通过使用像 foo[] 这样的 input 名称)。

添加注释

用户贡献的注释 10 条注释

15
amalcon _a_t_ eudoramail _d_o_t_ com
20 年前
请注意,当您要上传非常大的文件(或出于测试目的要将限制器设置得非常高)时,所有上传文件大小限制器都存储在带符号的 32 位整数中。这意味着设置超过约 2.1 GB 的限制会导致 PHP 看到一个很大的负数。我还没有找到任何解决方法。
7
Nirmal Natarajan
14 年前
如果使用 IIS 7.0 或更高版本,则默认情况下启用请求筛选,并且最大允许内容长度设置为 30 MB。

如果要允许上传超过 30 MB 的文件,则必须更改此值。

示例 web.config 条目

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

上述设置将允许发送 300 MB 的数据作为请求。希望这对某些人有所帮助。
4
adrien.nizon+phpnet at gmail dot com
8 年前
[编辑注:更准确地说,在 PHP 7.1 之前,MAX_FILE_SIZE 不能超过 PHP_INT_MAX。]

请注意,字段 MAX_FILE_SIZE 不能超过 2147483647。任何更大的值都会导致上传错误,该错误将在上传结束时显示

这由相关的 C 代码解释
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
max_file_size = atol(value);
}

该字符串被转换为长整数,其最大值为... 2147483647

似乎从 php-7.1.0beta3 开始已得到修正 (https://github.com/php/php-src/commit/cb4c195f0b85ca5d91fee1ebe90105b8bb68356c)
4
admin at creationfarm dot com
21 年前
Macintosh 操作系统(不确定 OSx 是否如此)使用双叉文件系统,这与世界其他地方不同;-)。每个 Macintosh 文件都具有数据叉和资源叉。当双叉文件遇到单叉文件系统时,某些内容必须消失,那就是资源叉。这被认为是一个问题(从一开始就是个坏主意),并且 Apple 开始建议开发人员避免将重要的文件信息粘贴到文件的资源叉部分,但某些文件仍然对此非常敏感。需要注意的主要文件是 Macintosh 字体文件和可执行文件,一旦资源叉从 Mac 字体或可执行文件中消失,它就毫无用处。为了保护这些文件,应在上传之前对其进行填充或压缩以保护资源叉。

大多数 Mac FTP 客户端(如 Fetch)允许以 Macbinhex 格式上传文件,这在通过 FTP 传输文件时也会保护资源叉。我还没有在任何 Mac 浏览器中看到等效的功能(但我也没有进行太多挖掘)。

仅供参考,Apple 确实有一个名为 ResEdit 的旧实用程序,可让您操作文件的资源叉部分。
1
dg at artegic dot de
14 年前
如果非确定性地出现 UPLOAD_ERR_PARTIAL 错误:HTTPD(例如 Apache)应响应 'Accept-Ranges: none' 标头字段。
1
morganaj at coleggwent dot ac dot uk
21 年前
以下情况也可能导致您的上传失败。如果您使用 Squid 或类似的代理服务器,请确保它没有限制 HTTP 标头的大小。我花了几个星期才弄清楚这一点!
1
anders jenbo pc dk
17 年前

回复 creationfarm.com 的管理员,Mac OS X 和在 NTFS 磁盘上运行的 Windows 也使用多流文件系统。但在 HTTP 上传时,仍然只传输数据流。最好将 Mac OS X 文件打包成 .dmg 文件而不是 zip 文件,但普通用户会发现 zip 文件更容易使用,并且它们在更多平台上受支持。
1
bohwaz
2 年前
请注意,为整个服务器或整个虚拟主机设置较大的 post_max_size 或 upload_max_filesize 不是一个好主意,因为它可能导致安全风险增加。

风险在于攻击者可能会发送非常大的 POST 请求,并使您的服务器内存和 CPU 过载,因为它必须在将这些请求处理到您的 PHP 脚本之前解析和处理这些请求。

因此,最好将更改此设置限制在某些文件或目录中。例如,如果我想在 /admin/files/ 和 /admin/images/ 中使用,我可以使用

<If "%{REQUEST_URI} =~ m!^/admin/(files|images)/! && -n %{HTTP_COOKIE}">
php_value post_max_size 256M
php_value upload_max_filesize 256M
</If>

我还要求请求具有 cookie 以避免基本攻击。这不会保护您免受来自未经身份验证用户的攻击,但可能会延迟任何攻击。

此设置可以在 Apache 服务器配置文件和 .htaccess 文件中使用。
0
[email protected]
19 年前
我花了一段时间才弄清楚这一点...

我认为这实际上是一个标头问题,但它只
在执行文件上传时发生。

如果您在
处理来自执行文件上传的表单的 $_POST[''] 后尝试 header("location:http://...") 重定向
(即具有 enctype="multipart/form-data"),如果在
location: 和 http 之间没有空格,则重定向
在 IE 中不起作用,即
header("location:http://...") 与
header("location: http://...")

===================================
<?php
if ($_POST['submit']=='Upload') {
// 处理文件并重定向...
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">
您的文件:<input name="filename" type="file">
<input name="submit" type="submit" value="Upload">
</form>
</body></html>
===================================

只有在以下所有条件都为真的情况下才会发生这种情况
header("location:http://...") 没有空格
正在处理的表单具有 enctype="multipart/form-data"
浏览器=IE

要解决此问题,只需添加空格即可。

希望这对其他人有所帮助。
0
[email protected]
21 年前
对于 apache,还要检查 LimitRequestBody 指令。
如果您运行的是 Red Hat 安装,则可能在 /etc/httpd/conf.d/php.conf 中设置了此项。
默认情况下,我的设置为 512 KB。
To Top