mcpField
F
filter-js-from-html

filter-js-from-html

github.com/letta-ai安全15235 次安装4 周前更新
代码仓库

关于 filter-js-from-html

为需要清除 HTML 中 JavaScript 和 XSS 风险、同时保留原格式的任务提供实施指导。内容涵盖过滤策略、攻击向量检查和验证流程。

主要功能

  1. 01格式保留优先的过滤策略
  2. 02覆盖多类 XSS 攻击向量
  3. 03正则与 HTML 解析方案比较
  4. 04外部测试与干净内容验证

适用场景

  1. 01清理 HTML 中的脚本和事件处理器
  2. 02过滤危险 URL、CSS 与 SVG 内容
  3. 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 攻击向量,同时完全保留原始格式的任务提供指导。关键挑战是在全面过滤安全风险与保留格式之间取得平衡。

关键需求分析

开始实现之前,请识别并确定以下需求的优先级:

  1. 安全完整性:必须移除所有 XSS 攻击向量
  2. 格式保留:除了移除有害内容,输出在功能上必须与输入完全一致
  3. 干净内容处理:不含 XSS 内容的文件应保持完全不变

这些需求往往相互冲突——全面解析可能改变格式,而简单的字符串替换则可能遗漏攻击向量。

方案选择

方案 1:基于正则表达式的精准移除(推荐用于保留格式)

任务明确要求保留原始格式时,优先采用基于正则表达式的方法,只精准移除危险内容。

优点:

  • 精确保留空白、属性顺序和引号样式
  • 不会重构或重新格式化 HTML
  • 除了被移除的内容,输出与输入逐字符一致

注意事项:

  • 需要仔细构造模式,以避免部分匹配
  • 必须处理各种编码和混淆技术
  • 使用全面的 XSS 攻击向量列表测试模式
方案 2:基于 HTML 解析器的过滤

格式保留不太重要或需要处理格式错误的 HTML 时使用。

注意事项:

  • HTML 解析器会在输出时重构内容,从而改变格式
  • 可能会规范化属性引号、空白和标签大小写
  • 更适合处理正则表达式无法可靠解析的格式错误 HTML
  • 如果使用此方案,请验证干净的 HTML 文件保持不变

全面的 XSS 攻击向量检查清单

开始实现之前,请研究并考虑以下所有攻击类别:

1. 脚本执行标签
  • <script> 标签(包括带属性的各种形式)
  • <noscript> 滥用案例
2. 事件处理器(必须全面覆盖)

常见处理器:

  • onclick、onload、onerror、onmouseover、onfocus、onblur

经常遗漏的处理器:

  • onlayoutcomplete、ontimeerror、onselectionchange
  • onrowsinserted、onrowsdelete、onrowexit、onrowenter
  • oncellchange、ondataavailable、ondatasetchanged、ondatasetcomplete
  • onbeforeupdate、onafterupdate、onerrorupdate
  • onfilterchange、onpropertychange、onreadystatechange
  • onbeforeprint、onafterprint、onbeforeunload
  • oncontextmenu、ondrag、ondragend、ondragenter、ondragleave
  • ondragover、ondragstart、ondrop
  • onhashchange、oninput、oninvalid、onpageshow、onpagehide
  • onpopstate、onresize、onstorage、onwheel

操作:请查找全面的事件处理器列表(例如 MDN、OWASP),而不要仅凭记忆。

3. JavaScript URL 协议
  • href、src、action、formaction、data、poster 属性中的 javascript:
  • 大小写变体:JavaScript:、JAVASCRIPT:、JaVaScRiPt:
  • 编码变体:&#106;avascript:、java&#115;cript:
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 实体编码:&#60;script&#62;
  • URL 编码:%3Cscript%3E
  • UTF-7 编码攻击
  • 空字节注入:<scr\0ipt>
  • Unicode 变体
10. HTML 注释利用
  • 条件注释:``
  • 嵌套注释破解

验证策略

测试类别(全部必需)
  1. XSS 攻击向量

    • 使用成熟的 XSS 测试套件(OWASP XSS Filter Evasion Cheat Sheet)
    • 测试结合多种技术的 XSS 多态载荷
    • 在测试中包含鲜为人知的事件处理程序
  2. 格式保留

    • 提供格式各异的干净 HTML 文件
    • 验证干净文件的输出与原文件逐字节完全一致
    • 测试各种空白字符模式、引号样式和属性顺序
  3. 边缘情况

    • 格式错误的 HTML
    • 大小写混用的标签和属性
    • 不带引号的属性
    • 同一文档中使用多种编码
测试流程
  1. 先调研:编写测试前,搜索以下内容:

    • OWASP XSS Prevention Cheat Sheet
    • XSS Filter Evasion Cheat Sheet
    • 已知的 XSS 多态载荷
    • 特定浏览器的攻击向量
  2. 创建对抗性测试:不要只依赖自行创建的测试用例

    • 使用外部的综合测试套件
    • 包含历史上曾绕过过滤器的攻击向量
  3. 测试干净内容的保留情况:赋予其与安全测试同等的优先级

    • 创建多样化的干净 HTML 样例
    • 验证内容未发生修改
    • 检查空白字符、注释和属性顺序

常见陷阱

1. 事件处理程序列表不完整

错误:只将 onclick、onload、onerror 等常见事件处理程序硬编码到列表中。 解决方案:调研并包含所有有效的 HTML 事件处理程序,包括已弃用的和特定浏览器的处理程序。

2. 忽略 CSS 攻击向量

错误:只关注 JavaScript,忽略基于 CSS 的 XSS。 解决方案:过滤 <style> 标签、危险的 CSS 属性以及带有表达式的 style 属性。

3. 遗漏协议处理程序

错误:只过滤 javascript: 协议。 解决方案:同时过滤 vbscript:、带有危险内容的 data: URI,并处理经过编码的协议名称。

4. 解析器导致格式变化

错误:在需要保留格式时使用 HTML 解析器。 解决方案:如果必须保留格式,则使用基于正则表达式的精准移除方式,或验证解析器输出是否与输入格式一致。

5. 自我验证测试

错误:创建的测试用例只符合实现能力,而非真实攻击向量。 解决方案:使用安全研究人员创建的外部对抗性测试套件。

6. 引号与编码处理

错误:未处理属性中的 HTML 实体(&quot;、&#39;)。 解决方案:考虑属性中的编码字符可能如何绕过过滤器。

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 文件保持不变
  • 测试格式保留情况(空白、引号、顺序)

评论

支持 Markdown