发布于2026-07-05 阅读(0)
扫一扫,手机访问
不少开发者第一次遇到这个问题时,第一反应往往是:是不是配置没开?是不是版本太低?是不是缓存没清?其实都不是。从 ThinkPHP 5.1 开始,框架已经主动从内核中移除了对原生 PHP 代码在模板中的支持。这不是一个漏洞,不是配置项能解决的,是框架开发者主动做出的设计选择。
解析模板引擎(think\template\driver\Think)在编译阶段会直接跳过所有 开头的标签。你的代码既不报错,也不执行,相当于被静默丢弃。你在模板里写个 ,页面输出就是空白,日志里也找不到任何相关错误提示。
这里有几个关键点值得注意:
tpl_deny_php 这个配置项在 5.1+ 中已被废弃,设置它也不会产生任何效果{php}...{/php} 标签同样不复存在,如果你在旧版文档中看到它,那说明文档已经过时{$name} 可以,而 不行问题的关键差别在于它们的运行环境完全不同。 {$name} 是模板引擎定义的变量定界符,在编译时会被替换为 echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');,自带安全转义。而 是直接通向 PHP 解析器的裸执行入口,它绕过了框架层所有防护机制。
更具体地说:
$this 不可用,self:: 和 ClassName:: 全部失效$data 通过 extract() 进入函数作用域,但上下文隔离缺失,$_GET、$_POST 等超全局变量可直接读写 这样的写法,路径穿越风险就立刻暴露出来别试图去“打开开关”,那不是解决问题的方向。按框架设计意图走才是正道:
{:} 标签:比如 {:date('Y-m-d', $time)} 或 {:count($list)},它会被编译成带转义的 PHP 表达式,既安全又简洁return view('index', ['result' => $value]); 传入模板think 引擎,切换成原生 PHP 模式——但前提是必须同步把模板后缀改成 .php,关掉所有 think 标签,并接受 {volist}、{if} 等所有框架模板标签全部失效最容易忽视的一点是:你以为只是“少写几个字符”的便利,实际上在模板里埋着 RCE 和 XSS 的双重入口。框架禁用它,不是限制你,是替你挡住很多开发者自己都没意识到的风险——那些可能暴露 eval() 或 system() 调用的危险场景。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8