我目前正在开发一个用户可以上传文件的网站。如何防止上传大文件?当时,没有选项(PHP post_max_size
和upload_max_filesize
)有用:文件完全上传。我只是希望用太大的文件关闭连接(事先检查Content-Length
HTTP标头,并通过检查文件上传时间)。是否有Apache指令或PHP配置密钥?
感谢您的时间!
编辑:添加Apache conf(CentOS默认)。
EDIT2:还添加了PHP conf(CentOS默认)。
EDIT3:当给出太大的文件时,似乎PHP会关闭管道。尽管如此,Apache仍允许转移直到它结束。
答案 0 :(得分:2)
您可以使用apache的LimitRequestBody
。语法很简单(以字节为单位):
LimitRequestBody 10490000 # 10 MB
这适用于httpd.conf
和.htaccess
,如果您在Ubuntu上修改httpd.conf
(sudo service apache2 restart
),请注意重新启动。
如果您需要为每个文件设置限制(将头像上传限制为5 MB,但将附件限制为20 MB),则可以使用<Files>
:
<Files avatarUpload.php>
LimitRequestBody 5242880 # 5 MB
</Files>
<Files attachmentUpload.php>
LimitRequestBody 20971520 # 20 MB
</Files>
答案 1 :(得分:2)
确定。
因此,您面临的主要问题是在完成上传后应用Apache指令 LimitRequestBody 或 LimitXMLRequestBody 。在检查大小之前,似乎apache正在等待临时文件夹中的完整文件。
因此,您需要在检测到过大的上传后立即切断连接。一次一次mod_throttle是一个可用的模块。检查此Alternative to mod_throttle servfault question,您可以获得可能符合您需求的带宽控制模块列表。
例如,mod_bwshare能够限制每个客户端IP的带宽,但这不是每请求per_IP限制。还有mod_quos,处理下载的很多限制,但我找不到很多上传管理的东西(只能关闭早期的慢上传)。另请参阅this answer on throttling uploads。
因此,您还可以检查操作系统级别限制(在TCP堆栈上)或高级防火墙功能(询问服务器故障)。
您还可以使用客户端限制工具,例如隐藏的表单值或js上传器设置,但就像客户端使用的任何东西一样,在安全性方面,您无法避免有人改变客户端限制。