单纯改后缀无法使 jpg 变成可执行 php 文件,因服务器仅依据真实内容和配置解析,非文件名;若无合法 php 代码且配置不允许多扩展解析,重命名无效。

直接改后缀无法让 JPG 变成可执行 PHP 文件
把 photo.jpg 重命名为 photo.php,服务器不会因此就去解析它为 PHP 代码——除非该文件**真实包含合法 PHP 代码**且服务器配置允许执行。单纯改后缀只是欺骗文件系统,对 Web 服务器(如 Apache、Nginx)和 PHP 解析器完全无效。
常见错误现象:Parse error: syntax error, unexpected ' 或直接下载/显示原始图片内容,说明服务器没走 PHP 解析流程。
- Web 服务器按 MIME 类型和后缀双重判断是否交由 PHP 处理
- 即使后缀是
.php,若文件开头是 JPEG 的\xff\xd8\xff字节,PHP 解析器会报错退出 - 某些老旧配置可能允许
AddType application/x-httpd-php .jpg,但这属于严重安全 misconfiguration,不应依赖
上传 JPG 文件时嵌入 PHP 代码的常见方式
这类操作常见于漏洞利用(如文件上传绕过),核心思路是让图片“看起来合法”,但又能在特定条件下触发 PHP 解析。不是改后缀,而是改内容或利用解析差异。
- 在 JPEG 文件末尾追加 PHP 代码:用十六进制编辑器在
FF D9(JPEG 结束标记)之后插入<?php phpinfo(); ?>,保存为shell.jpg - 利用 Apache 的
AddHandler或 Nginx 的fastcgi_split_path_info配置缺陷,通过shell.jpg/.php或shell.jpg/xxx.php触发解析 - 使用 PHP 的
exif_read_data()等函数读取图片中的注释字段(如 EXIF UserComment),把代码藏在那里——但需目标代码主动调用,不等于自动执行
为什么 imagecreatefromjpeg() 不会执行嵌入的 PHP?
PHP 的图像处理函数(如 imagecreatefromjpeg()、getimagesize())只解析图像结构,不会执行任意字节。它们把 JPEG 当作二进制数据流处理,忽略末尾附加的 PHP 标签。
立即学习“PHP免费学习笔记(深入)”;
-
imagecreatefromjpeg('shell.jpg')成功 ≠ 文件被当 PHP 执行 - 真正危险的是:上传后被 Web 服务器以 PHP 模式解析(例如路径被重写、后缀被强制映射)
- 现代 PHP 默认禁用
allow_url_include,且include 'shell.jpg'会直接 fatal error,除非文件本身是合法 PHP
实际开发中应避免的错误做法
试图靠改后缀实现“图片+功能”混合,本质是混淆关注点,也埋下严重安全隐患。
- 不要在生产环境启用
AddType application/x-httpd-php .jpg或类似指令 - 上传接口必须校验文件头(
bindec('11110000')对应\xff\xd0)、MIME 类型(用finfo_file(),而非$_FILES['type'])和扩展名白名单 - 用户上传的图片应存放在 Web root 外,或通过代理脚本输出,禁止直接通过 URL 访问物理路径
- 如果真需要动态生成图片,用
imagejpeg()+header('Content-Type: image/jpeg')输出,而不是塞 PHP 到图片里











