PHP短标签(<? ?>)本身非漏洞但启用后存在安全风险,核心是解析失控与兼容性缺失;应关闭short_open_tag,仅在必要时通过作用域限制、XML隔离和静态扫描补救,并在开发流程中嵌入IDE设置、CI检查与团队规范。

PHP短标签(<? ?>)本身不是漏洞,但启用后可能引发安全风险,核心问题在于解析行为失控和环境兼容性缺失。修复的关键不是“堵住某个漏洞”,而是控制解析边界、规避冲突场景、统一代码规范。
关闭 short_open_tag 是最稳妥的方案
绝大多数现代PHP项目无需短标签。从PHP 5.4起,短输出标签<?= ?>已默认可用,而<? ?>仍依赖配置开关。只要不主动使用<? ?>,就该关掉它:
- 找到当前生效的
php.ini(通过phpinfo()查看“Loaded Configuration File”) - 将
short_open_tag = On改为short_open_tag = Off - 重启Web服务(Apache/Nginx)或PHP-FPM进程
必须保留短标签时的补救措施
某些老旧系统或模板引擎(如早期Smarty)依赖<? ?>,若无法立即关闭,需做三重约束:
-
限定作用域:仅在特定目录(如
/templates/)启用,其他目录通过.htaccess(Apache)或location块(Nginx)强制禁用PHP解析 -
禁止混合XML输出:凡以
.xml、.xhtml、.rss为后缀的PHP文件,一律改用<?php ?>,并确保不含<?xml声明 -
静态扫描兜底:用
grep -r "<?" /path/to/project --include="*.php" | grep -v "<?php\|<?="定期检查残留的危险短标签
开发流程中同步加固
避免短标签问题反复出现,要嵌入日常开发环节:
立即学习“PHP免费学习笔记(深入)”;
-
IDE设置:在PhpStorm或VS Code中禁用短标签语法高亮,并配置保存时自动替换为
<?php -
CI检查:在Git Hook或CI流水线中加入脚本,拒绝含
<?[^p=]的PHP文件提交 -
团队约定:明确写入《PHP编码规范》,规定所有新代码禁止使用
<? ?>,存量代码分批改造
短标签的风险本质是“模糊边界”——它让PHP解析器和XML解析器、开发者意图与部署环境产生歧义。关掉它,比修十个绕过更省心。



















