必须用mime_content_type函数校验上传文件真实mime类型,前提是启用fileinfo扩展;需先move_uploaded_file再调用该函数;白名单应严格匹配text/x-php等安全类型,禁用application/x-httpd-php等危险类型。

当用户上传文件时,仅靠$_FILES['file']['type']判断类型极不可靠,攻击者可轻易伪造MIME类型,必须用mime_content_type函数对文件内容做二次校验,否则可能执行恶意PHP脚本。
确认系统已启用fileinfo扩展
运行php -m | grep fileinfo,若无输出则需启用——Ubuntu下执行sudo phpenmod -s all fileinfo,CentOS用sudo yum install php-fileinfo,【未启用fileinfo时mime_content_type始终返回false】。
读取上传文件并获取真实MIME类型
使用move_uploaded_file将临时文件移至安全目录(如/tmp/upload_abc123),再调用mime_content_type读取该路径下的文件。
不要直接传$_FILES['file']['tmp_name']给mime_content_type——某些PHP版本在文件未移动前会因权限或锁机制返回空字符串或application/x-empty。
比对合法MIME类型白名单
方法一:严格匹配文本类型
若期望上传纯文本PHP文件,只允许text/x-php、text/plain;【禁止放行application/octet-stream或application/x-httpd-php,后者是危险的旧式PHP MIME标识】。
方法二:宽松匹配但过滤可执行类型
用strpos($mime, 'text/') === 0 || strpos($mime, 'application/json') === 0,同时明确排除application/x-php、application/x-httpd-php、inode/x-empty。
结合文件头字节验证增强可靠性
第一步:用fopen打开已移动的文件,fread读取前4字节。
第二步:检查是否以
第三步:若检测到
第四步:只有mime_content_type结果合规且文件头无危险标记,才允许后续解析或存储。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











