HTML 模板示例未转义插值,复制使用时可能造成脚本注入
原文依据:1 处`highlight` 将传入值直接拼接到 `<mark>` HTML 中,没有进行 HTML 转义。示例中的值是固定姓名和年龄,但该通用函数没有限制输入来源。
如果网站把用户提交的姓名、搜索词或其他不可信文本传给此函数,再把结果作为 HTML 插入页面,攻击者可能注入标签或脚本,并以当前用户身份读取页面数据或执行操作。
这是展示标签模板的示例,函数确实把值直接拼入 HTML,但可见代码只传入固定的姓名和年龄,也没有把结果写入 DOM 或其他 HTML 解析入口。只有在调用者传入不可信字符串并将返回值作为 HTML 解析时,才可能发生脚本注入;当前来源不足以证明这种用法。用户可要求作者明确标注该函数不适合不可信输入,或提供转义示例。
这项判断针对展示的代码和适用条件,不表示风险已经实际发生。// Tagged template literalsfunction highlight(strings, ...values) { return strings.reduce((result, str, i) => { const value = values[i] || ""; return result + str + `<mark>${value}</mark>`; }, "");}const name = "John";const age = 30;const html = highlight`Name: ${name}, Age: ${age}`;// Output: "Name: <mark>John</mark>, Age: <mark>30</mark>"```