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-phpapplication/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对象详解  网站建设整体流程解析,建站其实很容易!  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南