php文件上传限制需服务端三重防护:一、修改php.ini中upload_max_filesize(单个文件)、post_max_size(整请求,须≥前者)、memory_limit(须>后者)并重启服务器;二、代码中校验$_files'file'、size及用finfo_open验证真实mime类型;三、前端max_file_size仅作提示,不可依赖。

PHP文件上传时限制大小和类型,主要靠服务端控制,不能只依赖前端(比如HTML的accept或JS校验),因为容易被绕过。核心是结合PHP配置、代码逻辑和适当提示,三者配合才安全可靠。
修改php.ini中的上传限制参数
这是最基础也最关键的一步,影响所有上传行为:
-
upload_max_filesize:单个文件最大允许体积(如
2M、10M) -
post_max_size:整个POST请求体上限,必须 ≥
upload_max_filesize,否则大文件直接被截断且无明确错误 - max_execution_time 和 max_input_time:上传大文件时需适当调高,避免超时中断
改完记得重启Web服务器(如Apache或PHP-FPM),并用 phpinfo() 确认生效。
在代码中校验文件大小与类型
即使配置了php.ini,仍需在接收后做二次校验——既防配置遗漏,也便于返回友好提示:
- 检查
$_FILES['file']['error']是否为UPLOAD_ERR_OK,排除上传失败情况(如超限返回UPLOAD_ERR_INI_SIZE) - 用
$_FILES['file']['size']对比预设阈值(例如 ≤ 2 * 1024 * 1024) - 类型判断别只信
$_FILES['file']['type'](浏览器提供,可伪造),应结合finfo_open(FILEINFO_MIME_TYPE)获取真实MIME - 白名单校验更安全:比如只允许
image/jpeg、application/pdf,拒绝其余所有
补充建议:提升用户体验与安全性
单纯报错不够,用户需要明确知道哪里错了,系统也需要防御常见攻击:
- 表单中加上
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">(单位字节),是PHP早期兼容性写法,虽不起决定作用但可辅助前端提示 - 保存文件前重命名(如用
uniqid() . '.' . $extension),避免执行恶意脚本(如上传shell.php.jpg后被解析) - 上传目录禁止执行PHP(通过Web服务器配置,如Nginx中
location ~ \.php$ { deny all; }) - 对图片类文件,可额外用
getimagesize()验证是否真为图像,防止伪装文件
不复杂但容易忽略。关键不是堆功能,而是每层都守住边界:配置设底线、代码做验证、存储保隔离。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











