8

我目前正在开发一个用户可以上传文件的网站。如何防止上传大文件?当时,没有任何选项(PHPpost_max_sizeupload_max_filesize)有用:文件已完全上传。我只想用太大的文件关闭连接(通过Content-Length事先检查 HTTP 标头,并在文件上传时检查)。是否有 Apache 指令或 PHP 配置密钥?

感谢您的时间!

编辑:添加Apache conf(CentOS 默认)。
EDIT2:也添加了PHP conf(CentOS 默认)。

EDIT3:当文件太大时,PHP 似乎关闭了管道。尽管如此,Apache 仍然允许传输直到结束。

4

2 回答 2

3

行。

因此,您面临的主要问题是上传完成后应用了 Apache 指令LimitRequestBodyLimitXMLRequestBody。似乎 apache 在检查大小之前正在等待临时文件夹中的完整文件。

所以你需要在检测到太大的上传后立即切断连接。曾几何时,mod_throttle 是一个可用于执行此操作的模块。检查此替代 mod_throttle servfault 问题,您可以获得可能满足您需求的带宽控制模块列表。

例如mod_bwshare能够限制每个客户端 IP 的带宽,但这不是每个请求的 per_IP 限制。还有mod_quos,处理了很多下载的限制,但是我找不到很多上传管理的东西(可能只关闭早期的慢速上传)。另请参阅有关限制上传的答案

因此,您还可以检查操作系统级别限制(在 TCP 堆栈上)或高级防火墙功能(询问 servfault)。

您还可以使用客户端限制工具,例如隐藏表单值或 js 上传器设置,但就像任何使用客户端的东西一样,就安全性而言,您无法避免有人更改客户端限制。

于 2012-08-01T12:39:35.807 回答
2

您可以使用 apache 的LimitRequestBody. 语法很简单(以字节为单位):

LimitRequestBody 10490000 # 10 MB

这适用于httpd.conf.htaccess,如果您编辑httpd.confsudo service apache2 restart在 Ubuntu 上),请注意重新启动。

如果您需要针对每个文件设置限制(将头像上传限制为 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 回答