应使用白名单机制的HTML清理库、服务端HTML解析与节点遍历过滤、正则预处理+语义校验组合过滤三种方法。其中白名单机制最安全,通过解析DOM重建仅保留允许标签与属性;服务端解析逐节点校验并剔除不合规内容;正则预处理仅作辅助,不可单独依赖。

如果您需要从HTML内容中移除潜在的无效标签、未闭合结构或可执行脚本等危险代码,则可能是由于直接渲染用户输入导致XSS风险或解析异常。以下是过滤HTML中无效或危险代码的多种方法:
一、使用白名单机制的HTML清理库
该方法通过预定义允许的标签、属性及值范围,仅保留安全子集,彻底剥离script、onerror、javascript:等高危元素。核心逻辑是解析DOM后重建,而非正则替换。
1、引入开源库如jsoup(Java)、html-sanitizer(Google)、DOMPurify(JavaScript)或bleach(Python)。
2、配置白名单:明确指定允许的标签(如p、strong、em、a),允许的属性(如href、class),并限制href值必须以http://、https://或/开头。
立即学习“前端免费学习笔记(深入)”;
3、调用清理函数处理原始HTML字符串,例如DOMPurify.sanitize(dirtyHtml)返回净化后的HTML。
4、对返回结果进行二次校验,确保输出中不存在任何。
二、服务端HTML解析与节点遍历过滤
该方法借助标准HTML解析器构建DOM树,逐节点判断类型与属性,递归剔除不合规节点,避免正则误删或绕过。
1、使用服务端解析器(如Python的lxml.html、Node.js的jsdom、Java的Jsoup)加载原始HTML。
2、遍历所有元素节点,检查tagName是否在安全列表中;若不在,调用drop_tree()或remove()彻底删除该节点及其子树。
3、对保留节点的每个属性进行校验:删除所有以“on”开头的属性名,对href和src属性验证协议白名单,禁止data:、vbscript:等伪协议。
4、序列化净化后的DOM为字符串,确保最终输出不包含任何被移除节点残留的文本内容或注释片段。
三、正则预处理+语义校验组合过滤
该方法适用于轻量级场景或无法引入解析器的环境,先用正则快速剥离明显危险模式,再结合简单语义规则补漏,但不可单独依赖正则。
1、使用正则表达式全局替换
2、匹配并清除所有on\w+\s*=\s*["'][^"']*["']形式的内联事件属性,以及javascript:、vbscript:、data:开头的href/src值。
3、对剩余HTML执行基础配对校验:统计数量是否相等,检查常见标签(如div、span、p)是否成对出现,对未闭合标签添加缺失的结束符或截断后续内容。
4、执行完毕后,人工抽检输出中是否存在双写标签(如)、编码绕过(如。
四、基于Content Security Policy的运行时防护
该方法不修改HTML源码,而是在HTTP响应头中声明策略,阻止浏览器执行非授权脚本,作为服务端过滤的补充防线。
1、在Web服务器配置中添加HTTP响应头:Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'。
2、移除'self'以外的外部域名,禁用'unsafe-inline'和'unsafe-eval',仅允许特定哈希或nonce标识的内联脚本。
3、对动态插入的HTML(如innerHTML赋值)启用trustedTypes API,强制要求所有赋值来源为TrustedHTML类型对象。
4、验证浏览器开发者工具的Console面板是否记录CSP violation报告,确认script标签及内联事件已被拦截。











