跳到主内容
快讯直播
AI智模界
AI 词典

服务端模板注入(SSTI):别把用户输入当模板

服务端模板注入(Server-Side Template Injection,SSTI)一句话说清:程序把用户能控制的字符串当成模板源码交给模板引擎去编译执行,而不是当成普通数据填进去,于是用户输入就从"内容"变成了"代码"。

模板引擎(template engine)的本来用途是把排版和内容分开。模板里写死一句 你好,{{ name }},运行时才把 name 的值填进占位符,同一个模板可以给一百万人用。这里的边界很关键:模板源码属于代码,占位符里的值属于数据。

打个比方:模板引擎像一台自动排版印刷机,模板是排版稿,占位符是留白的空位。正常流程是你把名字报给操作员,他填进空位、开机印刷。SSTI 则是你把一张写着"顺带把机器拆开、按我这张纸上的指令重装一遍"的纸塞进了排版稿——机器不认识这是"内容",它照着念了。

判断有没有这个问题,有个很朴素的探测办法:往输入框里填一段模板语法,比如 {{ 7*7 }}。如果页面上出现 49 而不是原样显示这串字符,说明输入被当成表达式求值了,边界已经破了。再往下走,攻击者能借模板语言访问到的对象一路往上翻,从读到服务端变量、配置文件,到找到能执行系统命令的入口,最终可能演变成远程代码执行(Remote Code Execution,RCE)。

它和几个容易混淆的邻居对比:

名称注入的是什么在哪里执行典型后果
SQL 注入SQL 语句结构数据库拖库、篡改数据
跨站脚本(XSS)浏览器脚本访客的浏览器盗取会话、钓鱼
SSTI模板表达式服务器进程信息泄露直至任意代码执行
提示词注入(AI 词典:Prompt Injection">Prompt Injection)自然语言指令大模型上下文越权动作、数据外泄

共同点是同一条老毛病:数据和代码的边界被字符串拼接抹掉了。区别在于执行位置和"语言"层级——SSTI 是语法层的,模板引擎会真的求值;提示词注入是语义层的,靠模型"听话"。

对从业者的实际意义有三条。第一,模板源码要来自可信的固定文件,绝不把用户输入拼进模板再渲染;确实要开放自定义模板时(低代码平台、邮件模板、报表生成),用沙箱环境、最小权限运行,关掉危险的内置能力。第二,输出转义是防 XSS 的,不等于防 SSTI,两者不在同一层,别拿一个当另一个的保险。第三,AI 应用里这条链路越来越常见:让大模型生成邮件或报表模板、再由服务端渲染,此时模型输出应当被当作不可信输入处理——它可能被上游的提示词注入带偏,吐出带模板表达式的"模板"。具体引擎的沙箱配置和安全建议,以各项目官方页面为准。

最后留一个自查句:这段字符串,是被读的,还是被执行的?

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。