如何通过PHP检测上传的文件是否为加密文件
PHP检测加密上传文件的实现方案
不同类型的加密文件都有固定的文件头特征或元数据标识,仅需读取文件头部的特征字段即可完成判定,不会占用过多服务性能,完全可以适配你的上传校验场景,具体实现方案如下:
检测加密压缩包(ZIP/RAR等)
使用PHP内置的ZipArchive类即可直接判定ZIP格式是否加密,代码示例:
$zip = new ZipArchive(); $openRes = $zip->open('/path/to/your/uploaded/file.zip'); // 返回对应错误码即为加密压缩包 if ($openRes === ZipArchive::ER_ENCRYPTED) { // 此处输出自定义错误提示即可 echo "禁止上传加密的压缩包文件"; } $zip->close();
如果需要支持RAR格式检测,安装PHP的rar扩展后,使用RarArchive类做同类逻辑判定即可。加密的Office文档(docx/xlsx/pptx)本质为加密压缩包,用上述方法也可识别。
检测加密PDF文件
PDF的加密标识会存在于文件前1KB的元数据中,无需加载整个文件即可判定,代码示例:
// 仅读取文件前1KB内容做特征匹配,性能开销极低 $pdfHeader = file_get_contents('/path/to/your/uploaded/file.pdf', false, null, 0, 1024); // 匹配PDF加密特征字段 if (preg_match('/\/Encrypt\s+\d+\s+\d+\s+R/i', $pdfHeader)) { // 此处输出自定义错误提示即可 echo "禁止上传加密的PDF文件"; }
通用优化建议
- 校验前先通过PHP内置的
finfo扩展判定文件的真实MIME类型,排除后缀伪造的无效文件,再对应执行对应类型的加密校验,减少不必要的性能消耗 - 若需要覆盖更多加密文件类型,可调用本地命令行工具(如7z、pdfinfo)完成检测,PHP通过
exec()获取返回结果即可:比如执行7z l 目标文件路径命令,若返回要求输入密码的提示即可判定为加密压缩包
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

