模板标签输出了脚本开标签,内容怎么会被当成代码执行

📅 2026-10-11 👁️ 0

站点内容被当成代码执行,只需要一步:模板引擎在渲染时收到的文本里含有一段开标签,而它把这个位置当作代码区开始解释。PbootCMS 的更新记录里就修过这样一条——站点标签输出脚本开标签的风险,同时增强了标签页参数过滤。修复的两个动作正好对应两层收口:输出位要过滤,进入标签的参数也要校验。凡是允许后台编辑的内容会流进模板或脚本引擎的系统,都面临同一条边界。

数据变成代码的那一步

模板文件里本来就有代码:标签语法、条件、循环都是给引擎看的指令。危险发生在「数据出口」被当成「代码入口」的时刻——引擎把用户可控的文本直接拼进待解释的源码,这段文本一旦带有引擎认识的起始标记,后面的内容就进入了指令流。从这一刻起,它不再是被显示的数据,而是被执行逻辑的一部分;同一条字符串在纯文本出口只是文字,在解释器入口就是行为。所以「内容怎么会执行」的答案是:它被放进了会解释它的位置。

标签位为什么要过滤

站点标签的输出位置很特殊:它常出现在模板拼装的最外层,有的实现还会把标签参数直接编译进模板源码。三个入口源源不断供给内容:后台编辑者录入、表单与评论提交、外部采集来的文章。任一路的内容带上了起始标记,且出口没过滤,问题就会在渲染时引爆。所以修复方案里「增强标签页参数过滤」与「输出位不再产生开标签」两件事必须同时做:参数面收窄可控输入的形态,输出面保证即使漏进来也不会被解释。

转义要按输出上下文分

同一段文本的去向不同,危险字符就不同,转义无法用一套通用清洗代替:

输出上下文 危险字符形态 正确做法
HTML 正文 标签起始符与实体 按 HTML 实体转义
属性值 引号分隔符与尖括号 属性上下文专用转义并加引号
脚本字符串 引号、反斜杠与结束标记 按脚本语法转义或改走数据接口
URL 参数 保留字符与编码注入 百分号编码并校验协议头

原则是消费者的解释语法决定转义方式;「先全局删一遍特殊字符再到处复用」的做法会把合法内容删坏,还漏掉上下文化攻击。

越靠前的过滤越省事

分层收口时优先级从前往后:录入与导入阶段做敏感词过滤与关键词替换,把明显畸形挡在入库前,AnQiCMS 的内容安全设置管的就是这一段;渲染阶段按上下文转义,这是防御跨站脚本的正解;接口与认证层收住注入类攻击面,AnQiCMS 内置防 SQL 注入与 XSS 攻击的防护属于这一层。越靠前,越能把问题留在数据形态、不让它靠近解释器;越靠后,越要依赖每一处出口的自觉。AnQiCMS 的可视化模板编辑允许直接修改模板代码,改模板的人自己也要守住这条边界:录入内容进模板时保持「它是数据」的定位。

常见问题

后台只有我能登录,还需要担心模板注入吗? 需要。可控内容不只来自登录者:采集来的文章、用户上传的文件名、评论都可能是源头,权限模型挡不住「数据里带的标记」。

把尖括号全局删掉不是更省心? 会误伤合法文本,也挡不住非 HTML 解释位置的注入。按输出上下文转义才不会两头不讨好。

模板引擎自带的自动转义够用吗? 默认场景够用,但自动转义通常只按 HTML 正文处理。属性、脚本、URL 位置要显式核对,混排模板里的「非 HTML 上下文」正是绕过点。

相关文章

图片处理库被列为攻击面,站点上传环节该收哪几道门禁

图片处理库在服务端解码用户上传的二进制内容,远程代码执行往往发生在解码器层而不是业务代码。PbootCMS在V3.2.22版本记录里把危险coder门禁、输入格式白名单与资源上限一起加入安全硬化,并修复了合法图片误判。本文按这三道门禁讲清站点上传环节该收的口子,以及收得太紧为什么会误伤正常图片。

2026-10-11

公告把示例功能整段移除以修掉资源分配问题,生产站该留演示代码吗

Drupal公告SA-CONTRIB-2026-215的评级只是Less critical,处理方式却把邮件示例功能整个移除,因为示例存在没有上限的资源分配问题。生产站要不要保留演示代码,判断依据应是暴露面而不是风险评级。本文拆解示例代码带出的三类风险、部署阶段的清理清单,以及保留演示入口时的限制办法。

2026-10-11

缓存过期后先给旧内容再后台更新,这个缓存指令解决什么

Cache-Control 的 stale-while-revalidate 允许在过期后的窗口期内先复用旧内容响应、同时后台向源站重新校验,把校验延迟从用户响应里隐藏。本文按 MDN 文档说明它与请求指令 max-stale、以及 no-cache 与 must-revalidate 的分工,并给出页面文档与静态资源分开设置的建议。

2026-10-11

政府门户和营销型官网选内容管理系统,看的能力项有什么不同

政府门户网站选内容管理系统优先看内容审核、敏感词过滤与用户组权限,营销型官网更看重关键词库、锚文本与表单的人机验证;robots配置与站点地图生成则是两类站点共用的底座。本文按约束差异拆开能力项,给出同一系统内两种配置取向,帮助按站点性质而不是按功能清单长短做选型。

2026-10-11

公式渲染模块被判跨站脚本,富文本过滤为什么要连渲染路径一起查

Drupal社区公告SA-CONTRIB-2026-195把MathJax模块的TeX渲染未转义JavaScript判为Critical跨站脚本,受影响版本低于4.1.2。富文本即使做了HTML标签白名单,公式、Markdown、图表等非HTML解析路径仍可能把数据当代码执行。本文说明如何读公告的版本区间与评级,并给出按输出上下文分别转义的自查清单。

2026-10-11

更新记录写的是上传扩展名黑名单没枚举全,靠黑名单挡上传为什么会漏

黑名单必须提前枚举所有恶意扩展名写法,新后缀变体、双重扩展名、大小写与编码变形都可能绕过不完整的枚举,同类系统PbootCMS的V3.2.16更新记录正记录了这类修复。本文给出扩展名白名单、内容类型核验与上传目录执行权限三层收口的做法,以及部署阶段要同步完成的一件事。

2026-10-11

统计说用 PHP 的网站约占七成,PHP 8 占其中约六成五,这两个数怎么用

W3Techs 2026年10月11日统计显示已知服务端语言的网站中69.7%使用PHP,PHP使用者中64.6%已在版本8。本文解释这两个数的口径与读法,并给出从生态、运行成本、部署形态与升级负担四项比较建站方案的框架,避免把部署占比直接当成技术结论。

2026-10-11

有论文指出生成式优化带来两类风险,内容站自查该看哪两处

有立场论文提醒,生成式引擎优化的风险落在引擎侧而非内容侧:一边是可见度更容易集中到少数来源,一边是未披露的商业影响可能混进证据与推理。站点能自查的是两处——谁在替你的页面说话,以及答案里有没有没交代的影响来源。

2026-10-11