关于 filter-js-from-html
为需要清除 HTML 中 JavaScript 和 XSS 风险、同时保留原格式的任务提供实施指导。内容涵盖过滤策略、攻击向量检查和验证流程。
主要功能
- 01格式保留优先的过滤策略
- 02覆盖多类 XSS 攻击向量
- 03正则与 HTML 解析方案比较
- 04外部测试与干净内容验证
适用场景
- 01清理 HTML 中的脚本和事件处理器
- 02过滤危险 URL、CSS 与 SVG 内容
- 03验证过滤前后格式及安全性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ skills --skill filter-js-from-html安装后在 Claude Code 中输入/filter-js-from-html确认已加载。
详细介绍
从 HTML 中过滤 JavaScript
概述
本技能为需要从 HTML 内容中移除 JavaScript 和 XSS 攻击向量,同时完全保留原始格式的任务提供指导。关键挑战是在全面过滤安全风险与保留格式之间取得平衡。
关键需求分析
开始实现之前,请识别并确定以下需求的优先级:
- 安全完整性:必须移除所有 XSS 攻击向量
- 格式保留:除了移除有害内容,输出在功能上必须与输入完全一致
- 干净内容处理:不含 XSS 内容的文件应保持完全不变
这些需求往往相互冲突——全面解析可能改变格式,而简单的字符串替换则可能遗漏攻击向量。
方案选择
方案 1:基于正则表达式的精准移除(推荐用于保留格式)
任务明确要求保留原始格式时,优先采用基于正则表达式的方法,只精准移除危险内容。
优点:
- 精确保留空白、属性顺序和引号样式
- 不会重构或重新格式化 HTML
- 除了被移除的内容,输出与输入逐字符一致
注意事项:
- 需要仔细构造模式,以避免部分匹配
- 必须处理各种编码和混淆技术
- 使用全面的 XSS 攻击向量列表测试模式
方案 2:基于 HTML 解析器的过滤
格式保留不太重要或需要处理格式错误的 HTML 时使用。
注意事项:
- HTML 解析器会在输出时重构内容,从而改变格式
- 可能会规范化属性引号、空白和标签大小写
- 更适合处理正则表达式无法可靠解析的格式错误 HTML
- 如果使用此方案,请验证干净的 HTML 文件保持不变
全面的 XSS 攻击向量检查清单
开始实现之前,请研究并考虑以下所有攻击类别:
1. 脚本执行标签
<script>标签(包括带属性的各种形式)<noscript>滥用案例
2. 事件处理器(必须全面覆盖)
常见处理器:
onclick、onload、onerror、onmouseover、onfocus、onblur
经常遗漏的处理器:
onlayoutcomplete、ontimeerror、onselectionchangeonrowsinserted、onrowsdelete、onrowexit、onrowenteroncellchange、ondataavailable、ondatasetchanged、ondatasetcompleteonbeforeupdate、onafterupdate、onerrorupdateonfilterchange、onpropertychange、onreadystatechangeonbeforeprint、onafterprint、onbeforeunloadoncontextmenu、ondrag、ondragend、ondragenter、ondragleaveondragover、ondragstart、ondroponhashchange、oninput、oninvalid、onpageshow、onpagehideonpopstate、onresize、onstorage、onwheel
操作:请查找全面的事件处理器列表(例如 MDN、OWASP),而不要仅凭记忆。
3. JavaScript URL 协议
href、src、action、formaction、data、poster属性中的javascript:- 大小写变体:
JavaScript:、JAVASCRIPT:、JaVaScRiPt: - 编码变体:
javascript:、javascript:
4. 其他危险协议
vbscript:(IE 旧版协议)- 含脚本内容的
data:URI:data:text/html,<script>...</script> data:text/html;base64,...编码的载荷
5. 基于 CSS 的攻击
- 含危险属性的
<style>标签 -moz-binding(Firefox 旧版属性)expression()(IE 旧版属性)behavior:属性- 使用 javascript 或 data URI 的
@import
6. Meta 标签攻击
<meta http-equiv="refresh" content="0;url=data:text/html,..."><meta http-equiv="refresh" content="0;url=javascript:...">
7. 外部资源加载
href值危险的<link>标签- 带有
data属性的<object>标签 - 带有
src属性的<embed>标签 <applet>标签(旧版)src或srcdoc中包含脚本的<iframe>
8. 基于 SVG 的攻击
<svg onload="...">和其他 SVG 事件处理程序<svg><script>...</script></svg>- 使用外部引用的 SVG
<use>
9. 编码与混淆
- HTML 实体编码:
<script> - URL 编码:
%3Cscript%3E - UTF-7 编码攻击
- 空字节注入:
<scr\0ipt> - Unicode 变体
10. HTML 注释利用
- 条件注释:``
- 嵌套注释破解
验证策略
测试类别(全部必需)
-
XSS 攻击向量
- 使用成熟的 XSS 测试套件(OWASP XSS Filter Evasion Cheat Sheet)
- 测试结合多种技术的 XSS 多态载荷
- 在测试中包含鲜为人知的事件处理程序
-
格式保留
- 提供格式各异的干净 HTML 文件
- 验证干净文件的输出与原文件逐字节完全一致
- 测试各种空白字符模式、引号样式和属性顺序
-
边缘情况
- 格式错误的 HTML
- 大小写混用的标签和属性
- 不带引号的属性
- 同一文档中使用多种编码
测试流程
-
先调研:编写测试前,搜索以下内容:
- OWASP XSS Prevention Cheat Sheet
- XSS Filter Evasion Cheat Sheet
- 已知的 XSS 多态载荷
- 特定浏览器的攻击向量
-
创建对抗性测试:不要只依赖自行创建的测试用例
- 使用外部的综合测试套件
- 包含历史上曾绕过过滤器的攻击向量
-
测试干净内容的保留情况:赋予其与安全测试同等的优先级
- 创建多样化的干净 HTML 样例
- 验证内容未发生修改
- 检查空白字符、注释和属性顺序
常见陷阱
1. 事件处理程序列表不完整
错误:只将 onclick、onload、onerror 等常见事件处理程序硬编码到列表中。
解决方案:调研并包含所有有效的 HTML 事件处理程序,包括已弃用的和特定浏览器的处理程序。
2. 忽略 CSS 攻击向量
错误:只关注 JavaScript,忽略基于 CSS 的 XSS。
解决方案:过滤 <style> 标签、危险的 CSS 属性以及带有表达式的 style 属性。
3. 遗漏协议处理程序
错误:只过滤 javascript: 协议。
解决方案:同时过滤 vbscript:、带有危险内容的 data: URI,并处理经过编码的协议名称。
4. 解析器导致格式变化
错误:在需要保留格式时使用 HTML 解析器。 解决方案:如果必须保留格式,则使用基于正则表达式的精准移除方式,或验证解析器输出是否与输入格式一致。
5. 自我验证测试
错误:创建的测试用例只符合实现能力,而非真实攻击向量。 解决方案:使用安全研究人员创建的外部对抗性测试套件。
6. 引号与编码处理
错误:未处理属性中的 HTML 实体("、')。
解决方案:考虑属性中的编码字符可能如何绕过过滤器。
7. 忘记 Meta Refresh
错误:未过滤包含危险 URL 的 <meta http-equiv="refresh">。
解决方案:将 meta 标签纳入过滤范围,尤其是带有 data: 或 javascript: URL 的标签。
8. 忽略外部资源
错误:未过滤 <link>、<object>、<embed> 标签。
解决方案:评估这些标签是否会加载或执行危险内容。
实现检查清单
在认为实现已完成之前:
- 研究全面的 XSS 攻击向量列表
- 实现对所有事件处理程序的过滤(不只是常见的事件处理程序)
- 处理 script 标签和 noscript 滥用
- 过滤 javascript:、vbscript: 和危险的 data: URI
- 处理基于 CSS 的攻击(style 标签、表达式、绑定)
- 处理 meta refresh 攻击
- 考虑 link、object、embed、applet 标签
- 处理基于 SVG 的攻击
- 考虑编码形式的变化
- 使用外部 XSS 测试套件进行测试
- 验证干净的 HTML 文件保持不变
- 测试格式保留情况(空白、引号、顺序)