layui.util.escape() 仅转义5个基础字符,无法防御URL伪协议、事件属性、大小写混淆或注释绕过等XSS变种,故不能替代后端校验或富文本安全处理。

layui.util.escape() 是最直接可用的方案,但它只做基础 HTML 实体转义,不能替代后端校验,也不能处理富文本场景。
为什么 escape() 不够用
它只转义 、<code>>、"、'、& 这 5 个字符,对以下情况完全无效:
- URL 中的
javascript:alert(1)或data:text/html,<script>...</script> - 事件属性如
onerror="alert(1)"、onclick,只要没被显式过滤就仍可执行 - 大小写混淆的
<script></script>或注释绕过<script><!-->alert(1)</script> - 富文本中合法的
<img alt="layui怎么在前端进行XSS安全过滤防止脚本注入攻击" >、<a></a>标签若带危险属性,escape()不会删掉它们
什么时候该用 escape(),什么时候不该用
适合用在纯文本渲染场景,比如用户昵称、评论摘要、表格字段等「只显示、不解析 HTML」的地方:
- 用
textContent或innerText渲染时,其实根本不需要escape()—— 浏览器自动当文本处理 - 必须用
innerHTML插入内容时(例如后台返回一段带格式的提示语),才需先过一遍escape() - 千万别用它处理富文本编辑器输出、用户提交的 HTML 片段、或任何可能含属性/事件的结构化内容
更安全的替代方案:DOMPurify + escape() 组合
如果业务确实要渲染用户提交的 HTML(如公告、帮助文档),layui.util.escape() 必须升级为白名单过滤:
立即学习“前端免费学习笔记(深入)”;
- 引入
DOMPurify(轻量、无依赖、Layui 项目可直接通过 CDN 加载) - 用
DOMPurify.sanitize(htmlString, { ALLOWED_TAGS: ['b','i','u','p','br'], ALLOWED_ATTR: ['class'] })显式限定允许的标签和属性 - 再把净化后的结果交给
innerHTML—— 这比单纯转义可靠得多 - 注意:
DOMPurify默认不开启FORBID_TAGS模式,别只靠黑名单配置
真正容易被忽略的点是:前端过滤永远可被绕过。哪怕你用了 DOMPurify,攻击者也能禁用 JS、改本地代码、或直接发请求绕过前端。所有用户输入最终必须经后端二次校验与存储前净化,否则前端再严也没意义。


















