防止php文件伪装需服务端校验文件内容:用finfo_open识别真实mime,禁用$_files['type'];图片类辅以getimagesize二次验证;上传目录禁执行权限;重命名文件并强制安全扩展名,路径随机化。

防止PHP文件类型伪装,关键在于不信任任何客户端提交的信息,所有校验必须在服务端基于文件内容完成。仅靠扩展名、Content-Type头或前端JS判断,都极易被绕过。
用finfo_open校验真实MIME类型
这是最基础也最关键的一步。PHP的finfo_open()函数通过读取文件头部“魔数”(Magic Number)识别真实类型,无法被后缀或HTTP头欺骗。
- 调用
finfo_open(FILEINFO_MIME_TYPE)获取文件二进制头解析出的MIME - 严格比对白名单,如
image/jpeg、application/pdf,拒绝text/html、application/x-php等危险类型 - 注意:不要用
$_FILES['file']['type'],它来自浏览器,完全不可信
结合getimagesize等专用函数做二次验证
对图片类文件,可额外调用getimagesize()。它不仅检查MIME,还会解析图像结构,能识别“图片马”(即在合法图片末尾追加PHP代码的文件)。
- 若
getimagesize()返回false,说明不是有效图像,应直接拦截 - 即使返回成功,也要再核对
$info['mime']是否在允许列表中 - 非图片文件(如PDF、CSV)需用对应专用库或
finfo深度检测
禁用上传目录的脚本执行权限
即使恶意文件意外上传成功,只要服务器不执行它,风险就大幅降低。
- 将上传目录置于Web根目录之外(如
/var/www/uploads/→/data/uploads/) - 若必须放在Web可访问路径下,通过Web服务器配置禁止执行:Apache用
php_flag engine off,Nginx用location ~ \.(php|sh|pl)$ { deny all; } - 避免使用
.htaccess控制,因部分环境可能忽略或被覆盖
重命名+强制安全扩展名
彻底切断原文件名与内容的关联,消除00截断、双扩展名等绕过手段。
- 丢弃
$_FILES['file']['name'],改用uniqid() . mt_rand(100,999) . '.jpg'等固定安全后缀 - 不要根据MIME动态拼接后缀(如
'.' . $ext),防止扩展名注入 - 存储路径也建议随机化子目录,如
uploads/2026/09/abc123.jpg,防遍历和暴力猜解
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











