PHP如何判断文件是否为脚本_PHP脚本文件检测法【类型】
发布时间 - 2026-02-02 00:00:00 点击率:次最可靠方法是用 finfo_file() 基于内容识别 MIME 类型,再检测文件头是否含 PHP 标记(如

用 finfo_file() 检测真实 MIME 类型最可靠
仅靠扩展名(如 .php)判断脚本文件极不可靠——攻击者可上传 shell.jpg.php 或伪造后缀绕过。PHP 的 finfo_file() 基于文件内容识别类型,能有效识别被伪装的 PHP 脚本。
实操建议:
- 确保
fileinfo扩展已启用(php -m | grep fileinfo) - 使用
FILEINFO_MIME_TYPE模式,避免返回完整 MIME 字符串干扰判断 - 对上传临时文件路径调用,而非原始文件名
- 典型 PHP 脚本的 MIME 类型是
text/x-php或application/x-httpd-php,但不同系统可能略有差异,建议同时检查是否含php字样
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, '/tmp/php_upload_abc123');
finfo_close($finfo);
if (stripos($mimeType, 'php') !== false) {
// 可疑 PHP 脚本
}
检查文件头是否含 PHP 开始标记
MIME 类型可能被刻意伪造,进一步验证文件内容开头是否含 PHP 标记(如 、、='),这是脚本执行的前提。
注意点:
- 用
file_get_contents($path, false, null, 0, 128)读取前 128 字节即可,避免大文件性能损耗 - 需考虑编码问题:BOM 头(如 UTF-8 BOM)可能出现在
前,应先用trim($content, "\xEF\xBB\xBF")去除 -
是短标签,依赖short_open_tag配置,生产环境通常关闭,但攻击者仍可能利用,建议一并检测
警惕 .phtml、.php5、.inc 等非标准扩展名
Web 服务器配置决定哪些扩展名会被解析为 PHP。Apache 默认解析 .php、.phtml;Nginx 则完全依赖 location ~ \.php$ 这类正则匹配。攻击者常利用冷门扩展名绕过白名单。
检测时应:
- 不只比对扩展名白名单,而要结合 Web 服务器实际配置逻辑模拟判断
- 常见可执行扩展包括:
.php、.phtml、.php3、.php4、.php5、.php7、.phar、.inc(若被包含在其他脚本中) - 注意大小写:
.PHP在 Windows 下等效,Linux 下可能不解析,但某些 Nginx 配置会忽略大小写
为什么 mime_content_type() 和 getimagesize() 不推荐
mime_content_type() 是 finfo 的旧别名,已废弃,行为不稳定;getimagesize() 仅适用于图像,对 PHP 文件返回 false,但无法区分「不是图」和「是恶意脚本」,容易误判。
更危险的是:部分函数(如 exif_imagetype())在遇到非图像文件时会触发警告甚至解析失败,导致异常暴露路径或中断流程。
真正安全的做法是组合使用:finfo_file() 初筛 + 内容头检测 + 扩展名上下文校验,三者缺一不可。
尤其要注意:即使文件看起来像图片(MIME 为 image/jpeg),只要开头含 ,就可能是嵌入了 WebShell 的图片马——这种混合型文件最容易被漏检。
# php
# linux
# html
# php7
# windows
# apache
# nginx
# 编码
# app
# 字节
# win
# php脚本
# NULL
# 字符串
# bom
# location
# 扩展名
# 的是
# 最可靠
# 这是
# 上传
# 出现在
# 适用于
# 要注意
# 这类
# 而非
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
如何选择PHP开源工具快速搭建网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何在IIS7中新建站点?详细步骤解析
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
网站建设要注意的标准 促进网站用户好感度!
详解jQuery中基本的动画方法
韩国服务器如何优化跨境访问实现高效连接?
Linux系统命令中screen命令详解
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何在Windows服务器上快速搭建网站?
如何获取PHP WAP自助建站系统源码?
如何快速搭建FTP站点实现文件共享?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何实现建站之星域名转发设置?
网站制作报价单模板图片,小松挖机官方网站报价?
WordPress 子目录安装中正确处理脚本路径的完整指南
如何在IIS中新建站点并解决端口绑定冲突?
如何在搬瓦工VPS快速搭建网站?
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel集合Collection怎么用_Laravel集合常用函数详解
MySQL查询结果复制到新表的方法(更新、插入)
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何快速搭建安全的FTP站点?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
linux写shell需要注意的问题(必看)
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Swift中循环语句中的转移语句 break 和 continue
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何在万网主机上快速搭建网站?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
php485函数参数是什么意思_php485各参数详细说明【介绍】
制作企业网站建设方案,怎样建设一个公司网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
C#如何调用原生C++ COM对象详解
网站建设整体流程解析,建站其实很容易!
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南

