防止php文件类型篡改需从内容、存储、执行环境三方面设防:用finfo_open检测真实mime类型并白名单校验;强制重命名(uniqid+随机字节+mime映射扩展名);上传目录置于web根外或配置服务器禁用脚本解析。

防止PHP文件类型篡改,核心是阻断攻击者将恶意代码伪装成合法文件上传并执行。不能只靠扩展名或HTTP头判断,必须从内容、存储、执行环境三方面设防。
校验真实文件类型(不看后缀,看内容)
客户端传来的$_FILES['file']['type']和文件名后缀完全不可信,攻击者可轻易伪造。必须用二进制层面检测:
- 用
finfo_open(FILEINFO_MIME_TYPE)读取文件头部“魔术字节”,获取真实MIME类型 - 严格比对白名单,例如只允许
image/jpeg、application/pdf、text/plain - 对图片类文件,额外调用
getimagesize()二次确认——它会解析图像结构,能识别出“套壳”文件(如在PNG末尾插入PHP代码) - 拒绝
text/html、application/x-php、application/x-sh等任何可被Web服务器解析执行的类型
强制重命名并剥离原始信息
原始文件名可能含../shell.php路径遍历、空字节截断或危险后缀,必须彻底丢弃:
- 完全忽略
$_FILES['file']['name'],不参与任何拼接逻辑 - 生成新文件名:组合
uniqid()+random_bytes(8)+ 固定扩展名(如.jpg) - 扩展名由MIME类型映射决定(
image/png → .png),而非用户输入 - 确保新名不含
/、\、控制字符、空格及Unicode分隔符
隔离存储与禁用脚本解析
即使恶意文件侥幸上传成功,也要让它无法被执行:
- 上传目录必须放在Web根目录之外(如
/var/data/uploads/),而非public/uploads/ - 若必须放Web目录下,需在Web服务器配置中显式禁止执行:
Nginx示例:location ^~ /uploads/ { deny all; }
Apache示例:<directory> php_flag engine off </directory> - 上传目录权限设为
755,文件设为644,严禁777
深度扫描可疑内容(可选但推荐)
针对高风险场景(如CMS后台、用户头像上传),增加一层内容检测:
- 用
ClamAV或php-malware-finder扫描临时文件,查eval、base64_decode、gzinflate等后门特征 - 对图片做轻量级处理(如GD库缩放1像素再保存),可清除嵌入的恶意载荷
- 记录所有上传行为日志,包括IP、时间、原始名、MIME、大小、新文件名,便于溯源
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











