背景与价值模板注入会导致任意代码执行或XSS。统一的沙箱与输出转义策略可在渲染层阻断风险。统一规范输出转义:对用户输入统一进行HTML转义。变量白名单:仅允许渲染受控变量集并限制长度。沙箱渲染:避免可执行模板语法与运行时求值。核心实现HTML转义与变量白名单function escapeHtml(s: string): string { return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;') } type Context = Record<string, string> const allowVars = new Set(['title','content','username']) function sanitizeCtx(ctx: Record<string, any>): Context { const out: Context = {}; for (const [k,v] of Object.entries(ctx)) { if (!allowVars.has(k)) continue; const s = String(v || ''); if (s.length > 2048) continue; out[k] = escapeHtml(s) } return out } 简化模板渲染function render(tpl: string, ctx: Context): string { return tpl.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g, (_, k) => ctx[k] ?? '') } 落地建议采用不可执行的模板语法并统一进行输出转义,避免运行时求值。变量白名单与长度限制保障可控渲染范围,拒绝不受控字段。对模板与上下文进行审计,持续优化变量白名单与转义规则。验证清单输出是否经过HTML转义;变量是否命中白名单与长度限制。

发表评论 取消回复