thinkphp 模板引擎通过严格限制变量输出语法和禁用危险函数来防止 ssti。在模板中,所有动态内容必须使用 {} 或 {$} 包裹,且仅支持简单的属性访问、数组索引和有限的函数调用(如 date, json_encode),无法直接执行任意 php 代码。要过滤敏感数据,应在控制器层对输入进行清洗,或在模型层设置隐藏字段,避免将未经验证的数据直接传入模板。

如何配置模板引擎以增强安全性?
可以通过修改配置文件关闭模板中的某些高级功能,例如禁用 php 标签的使用。在 ThinkPHP 5/6 中,默认情况下模板引擎是安全的,但为了进一步加固,可以检查 config/template.php 中的 tpl_replace_string 和 tpl_search_string 配置项,确保没有自定义的危险替换规则。此外,确保 template_func_whitelist 只包含必要的白名单函数,移除任何可能用于系统命令执行的函数。

// config/template.php
return [
'tpl_replace_string' => [
'__PUBLIC__' => '/public',
'__STATIC__' => '/static',
],
'tpl_search_string' => '{%',
'tpl_replace_string' => '%}',
// 确保没有危险的函数被允许
'tpl_func_whitelist' => ['date', 'json_encode', 'count'],
];
上述配置确保了模板中只能使用预定义的简单函数,并且替换字符串是固定的,防止了通过模板注入执行恶意代码。开发者应定期检查此配置文件,确保没有意外引入新的危险功能。
如何在控制器层处理用户输入以防止 SSTI?
在控制器中接收用户输入后,应立即进行验证和过滤。使用 ThinkPHP 的验证器类 validate 来检查输入是否符合预期格式,例如邮箱、数字或特定字符串模式。对于可能包含模板语法的输入,应使用 htmlspecialchars 或 strip_tags 进行转义,然后再传递给模板。这样可以确保即使攻击者尝试注入模板代码,也会被当作普通文本处理,而不会被解析执行。

// app/controller/Index.php
namespace app\controller;
use think\Validate;
class Index {
public function test() {
$data = input('post.');
$validate = new Validate([
'name' => 'require|max:25|alpha',
'email' => 'email'
]);
if (!$validate->check($data)) {
return json(['error' => $validate->getError()]);
}
// 转义潜在的危险字符
$safeName = htmlspecialchars($data['name'], ENT_QUOTES, 'UTF-8');
return view('index/test', ['name' => $safeName]);
}
}
该示例展示了如何在控制器层对用户输入进行严格验证和转义,确保只有合法的数据进入模板渲染流程,从而有效防止 SSTI 攻击。开发者应始终遵循这一原则,对所有外部输入保持警惕。
如果模板中需要显示用户提交的 HTML 内容怎么办?
如果业务需求确实需要在模板中显示用户提交的 HTML 内容,必须使用专门的 HTML 净化库,如 Purifier 或 HTMLPurifier,在控制器层对内容进行清洗后再传递。切勿直接将原始 HTML 放入模板,因为即使使用了 {} 语法,某些复杂的 XSS 向量仍可能绕过基本的转义机制。此外,考虑使用 CSP (Content Security Policy) 头来限制页面中可以加载的资源和执行脚本的来源,作为额外的安全层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











