html解析器会将script标签内任何子串视为结束标记,导致脚本截断、语法错误或xss;应使用外部js、data属性、json脚本块或字符串拆分(如"")规避。

在行内 <script></script> 标签中直接拼接字符串时,若内容含 (哪怕只是子串),浏览器 HTML 解析器会提前终止脚本块,导致后续 JS 代码不执行、语法错误或 XSS 漏洞。这不是 JS 引擎问题,而是 HTML 解析阶段的硬性截断。
避免在 script 中直接写含 的字符串
HTML 解析器看到 就关闭当前 script 元素,不管它是否在 JS 字符串里。例如:
<script> const html = "<div></script>"; document.write(html);
上面代码实际被解析为:<script> const html = "<div></</script>(后面被当作 HTML 内容,script>";... 变成乱码甚至报错。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
推荐做法:用外部 JS 文件或 data 属性注入
把动态内容从 HTML 中剥离,避免解析器混淆:
- 将模板或数据放在
<script type="application/json"></script>或<script id="tpl" type="text/template"></script>中,再用 JS 读取 - 用
data-属性存安全转义后的值:<div id="app" data-html="<div></script></div>"></div>,JS 中el.dataset.html获取 - 服务端渲染时,对插入到 inline script 中的变量做 HTML 实体转义(如
/→/),但注意 JS 字符串需解码后使用
必须用 inline script 时,拆分敏感字符串
如果无法避免,可手动破坏 连续性:
- 写成
""—— 斜杠被 JS 引擎识别为转义,但 HTML 解析器不认,仍能正确闭合 - 或用字符串拼接:
""、"" - 注意:仅对字面量有效;若内容来自用户输入或变量,必须先校验/过滤/编码,不能依赖拆分
服务端输出时主动防御
后端模板引擎(如 Jinja2、Thymeleaf、EJS)应提供 js-string 或 json 转义 filter:
- 把原始字符串转为合法 JS 字符串字面量(自动加引号、转义引号和反斜杠、Unicode 编码控制字符)
- 更稳妥的是输出为 JSON:
const data = {{ user_input|tojson }};(Jinja2),由 JS 直接解析 - 禁止直接
{{ raw_html }}插入到 inline script 中
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










