全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php如何上传文件校验文件头信息_php读取文件魔数判断真实类型防伪装

文件魔数是文件头的十六进制标识,用于准确识别文件类型,如JPG为FFD8FF、PNG为89504E47;PHP可通过fread读取文件前16字节并转换为十六进制,再与标准魔数比对,结合finfo获取MIME类型、限制目录执行权限及重命名文件等措施,可有效防止恶意文件上传。

上传文件时仅靠扩展名判断类型很容易被绕过,攻击者可以将恶意脚本伪装成图片或其他安全格式。为提高安全性,PHP应通过读取文件的“魔数”(即文件头信息)来识别文件的真实类型。

什么是文件魔数?

文件魔数是文件开头的一段十六进制数据,用于标识文件的真实格式。例如:

  • JPG 文件开头通常是 FF D8 FF
  • PNG 文件开头是 89 50 4E 47
  • GIF 文件以 47 49 46 38(GIF8)开始
  • PRPS 文件(PDF)为 25 50 44 46(%PDF)

这些数据无法通过简单修改后缀名改变,因此更可靠。

使用 PHP 读取文件头并校验类型

可以通过 fread() 读取文件前几个字节,并与已知魔数比对:

function checkFileMimeType($filePath) {
    $handle = fopen($filePath, 'rb');
    if (!$handle) {
        return false;
    }
    
    // 读取前16个字节
    $bin = fread($handle, 16);
    fclose($handle);

    $hexValues = unpack('H*', $bin);
    $hex = strtoupper($hexValues[1]);

    // 提取前几位进行匹配
    $header = substr($hex, 0, 8);

    if (strpos($header, 'FFD8FF') === 0) {
        return 'image/jpeg';
    } elseif (strpos($header, '89504E47') === 0) {
        return 'image/png';
    } elseif (strpos($header, '47494638') === 0) {
        return 'image/gif';
    } elseif (strpos($header, '25504446') === 0) {
        return 'application/pdf';
    }

    // 可继续添加其他类型...

    return 'unknown';
}

// 使用示例
$uploadedFile = $_FILES['file']['tmp_name'];
$mimeType = checkFileMimeType($uploadedFile);

if ($mimeType === 'image/jpeg' || $mimeType === 'image/png') {
    // 允许上传
} else {
    die('文件类型不合法!');
}

结合 MIME 类型多重验证更安全

建议组合以下方式提升安全性:

  • 校验文件头魔数:防止伪造扩展名
  • 使用 finfo 扩展获取 MIME 类型
    
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mimeType = finfo_file($finfo, $filePath);
    finfo_close($finfo);
        
  • 限制上传目录权限:禁止执行脚本(如 .php)
  • 重命名上传文件:避免利用已知文件名攻击

常见问题与注意事项

某些图像编辑软件可能在文件头部添加额外数据(如元信息),影响读取。建议多读取一些字节并跳过常见干扰位,或结合多种方法交叉验证。

不要完全依赖 $_FILES['type'],该值由客户端提供,极易伪造。

基本上就这些,魔数检测虽不能百分百防御所有伪装,但能有效拦截大多数基础攻击手段。配合其他措施,可大幅提升文件上传的安全性。


# php  # app  # 字节  # pdf  # 常见问题  # 扩展名  # 比对  # 上传文件  # 重命名  # 文件上传  # 上传  # 几个  # 很容易  # 能在  # 可以通过 


相关文章: 阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站之星在线版空间:自助建站+智能模板一键生成方案  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  学校建站服务器如何选型才能满足性能需求?  如何快速搭建高效服务器建站系统?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在阿里云服务器自主搭建网站?  如何在IIS中新建站点并配置端口与物理路径?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何挑选高效建站主机与优质域名?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  相册网站制作软件,图片上的网址怎么复制?  长沙做网站要多少钱,长沙国安网络怎么样?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何在云主机上快速搭建多站点网站?  淘宝制作网站有哪些,淘宝网官网主页?  如何用花生壳三步快速搭建专属网站?  网站制作软件有哪些,制图软件有哪些?  在线制作视频的网站有哪些,电脑如何制作视频短片?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站之星安装后界面空白如何解决?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  文字头像制作网站推荐软件,醒图能自动配文字吗?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  南京网站制作费用,南京远驱官方网站?  如何通过西部建站助手安装IIS服务器?  建站之星如何配置系统实现高效建站?  如何选择靠谱的建站公司加盟品牌?  建站之星好吗?新手能否轻松上手建站?  小程序网站制作需要准备什么资料,如何制作小程序?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  广州营销型建站服务商推荐:技术优势与SEO优化解析  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  北京网站制作的公司有哪些,北京白云观官方网站?  如何选择建站程序?包含哪些必备功能与类型?  公司网站制作价格怎么算,公司办个官网需要多少钱?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何在企业微信快速生成手机电脑官网?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何快速建站并高效导出源代码?  Swift中switch语句区间和元组模式匹配  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  香港服务器选型指南:免备案配置与高效建站方案解析  php json中文编码为null的解决办法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。