针对 JavaScript/TypeScript、React、Vue 等的 XSS 静态漏洞扫描器(OWASP A03:2021),可检测反射、存储和 DOM 型 XSS。
phy-xs- 审计 — XSS 易碎性 Static Scanner. 跨服务器侧渲染,客户端DOM操作等10项检查的跨 Scans 跨空间脚本(XSS)易碎
功能概述
phy-xs- 审计 — XSS 易碎性 Static Scanner. 跨服务器侧渲染,客户端DOM操作等10项检查的跨 Scans 跨空间脚本(XSS)易碎是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
核心要点
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
- 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
使用与执行
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
结果检查与注意事项
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
phy-xss-audit — XSS 漏洞静态扫描器
对源代码执行跨 10 类规则的扫描,覆盖服务端渲染、客户端 DOM 操作及框架特有模式,识别 跨站脚本(XSS) 漏洞。映射至 OWASP A03:2021 — 注入 和 CWE-79。
快速开始
# 扫描整个项目 python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . # 扫描单个文件 python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py src/components/Post.tsx # CI 模式 — 发现任意 CRITICAL 或 HIGH 级别问题即退出状态码 1 python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . --ci # JSON 输出(适用于 SARIF 流水线) python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . --format json # GitHub Actions 注解格式输出 python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . --format github # 仅运行某一项检查 python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . --check XV003
10 类检查项
| ID | 严重性 | 标题 | CWE | 支持语言 |
|---|---|---|---|---|
| XV001 | HIGH | innerHTML / outerHTML 中使用用户数据 | CWE-79 | JS/TS/Vue/HTML |
| XV002 | HIGH | document.write() 中使用用户数据 | CWE-79 | JS/TS/HTML |
| XV003 | CRITICAL | eval() / setTimeout(string) 中使用用户数据 | CWE-95 | JS/TS/Vue |
| XV004 | HIGH | dangerouslySetInnerHTML 未配合 DOMPurify 使用 | CWE-79 | React JSX/TSX |
| XV005 | CRITICAL | Django mark_safe() / autoescape off | CWE-79 | Python/HTML |
| XV006 | CRITICAL | Jinja2 | safe 过滤器或 Markup() 绕过 | CWE-79 | Python/HTML |
| XV007 | HIGH | PHP echo/print 未调用 htmlspecialchars | CWE-79 | PHP |
| XV008 | HIGH | ERB raw / html_safe 未配合 sanitize 使用 | CWE-79 | Ruby/ERB |
| XV009 | HIGH | Vue v-html 中绑定动态表达式 | CWE-79 | Vue |
| XV010 | HIGH | Angular bypassSecurityTrust / Go template.HTML 类型转换 | CWE-79 | TS/Go |
通过 / 部分通过 / 不通过判定标准
XV001 — innerHTML / outerHTML 中使用用户数据
- 不通过(HIGH):存在
element.innerHTML =或.html()(jQuery)赋值操作,且用户可控数据(如req.query、req.body、request.GET、location.search等)在 ±20 行范围内流入,且附近无DOMPurify.sanitize()防护。 - 通过:赋值前已使用
DOMPurify.sanitize(input)进行净化,或数据来源为内部/静态内容。
XV002 — document.write() 中使用用户数据
- 不通过(HIGH):在邻近代码行中,
document.write()或document.writeln()调用传入了用户可控数据。 - 通过:
document.write()仅输出开发者控制的静态字符串(无任何用户输入路径)。
XV003 — eval() / setTimeout(string) 中使用用户数据
- 不通过(CRITICAL):出现
eval(userVar)、setTimeout(userVar + "...")或new Function(...)等调用,且参数中直接包含用户数据;测试/规格文件(*.test.js/*.spec.ts)中的此类调用被跳过。 - 通过:
eval()仅用于静态字符串(如 JSON Schema),或用户数据通过安全的JSON.parse()传入。
XV004 — dangerouslySetInnerHTML 未配合 DOMPurify 使用
- 不通过(HIGH):React 组件中使用
dangerouslySetInnerHTML={{ __html: ... }},但该值在 ±5 行范围内未被DOMPurify.sanitize()包裹。 - 通过:该值为
DOMPurify.sanitize(html)的返回结果 —— 即代码中在 ±5 行内出现DOMPurify.sanitize(模式。
XV005 — Django mark_safe() / autoescape off
- 不通过(CRITICAL):出现
mark_safe(user_data)调用,且用户可控数据在 ±10 行范围内流入;同时,模板中任意位置出现{% autoescape off %}均触发告警。 - 通过:
mark_safe()仅包裹开发者定义的静态 HTML 字符串,或数据已先经bleach.clean()净化。
XV006 — Jinja2 | safe 过滤器或 Markup() 绕过
- 不通过(CRITICAL):模板变量通过
| safe过滤器或被Markup()包裹,且用户可控数据在 ±10 行范围内流入。 - 通过:
| safe仅用于开发者控制的内容(例如:无用户输入参与的静态站点生成器输出)。
XV007 — PHP echo/print 未调用 htmlspecialchars
- 不通过(HIGH):出现
echo $_GET['key']或echo $var等输出语句,且同一行未调用htmlspecialchars()/htmlentities()/strip_tags()/filter_input()等函数进行转义。 - 通过:所有用户输入在输出前均被
htmlspecialchars($var, ENT_QUOTES, 'UTF-8')包裹。
XV008 — ERB raw / html_safe 未配合 sanitize 使用
- 不通过(HIGH):ERB 模板中出现
<%== user_var %>、user_var.html_safe或raw user_var,且用户输入在 ±10 行范围内流入,且附近无sanitize()或strip_tags()防护。 - 通过:输出使用
h(var)/escape_html(),或用户值被sanitize()显式包裹。
XV009 — Vue v-html 中绑定动态表达式
- 不通过(HIGH):出现
v-html="someVar",且该值为动态计算所得,且周围 10 行内未见DOMPurify.sanitize()调用。 - 通过:该值在绑定至
v-html前已通过DOMPurify.sanitize(rawHtml)计算得出。
XV010 — Angular bypassSecurityTrust / Go template.HTML 类型转换
- 不通过(HIGH):Angular 中调用
bypassSecurityTrustHtml(userVar)或bypassSecurityTrustScript(userVar),且用户数据在邻近范围内流入;Go 中对用户可控输入执行template.HTML(userStr)或template.JS(userStr)类型转换。 - 通过:Angular — 未调用任何 bypass 方法,改用标准
[innerHTML]绑定;Go — 交由html/template自动处理转义(绝不将用户字符串强制转换为template.HTML类型)。
覆盖的 XSS 类型
| XSS 类型 | 对应检查项 |
|---|---|
| 反射型 XSS | XV001, XV002, XV005, XV006, XV007 |
| 存储型 XSS | XV001, XV004, XV008, XV009 |
| 基于 DOM 的 XSS | XV001, XV002, XV003 |
| 服务端模板注入 → XSS | XV005, XV006 |
| 框架绕过型 XSS | XV004, XV009, XV010 |
支持的语言与框架
| 语言 | 框架 | 检查项 |
|---|---|---|
| JavaScript / TypeScript | Vanilla, React, Vue, Angular | XV001–XV004, XV009, XV010 |
| Python | Django, Jinja2 (Flask/FastAPI) | XV005, XV006 |
| PHP | Vanilla, WordPress | XV007 |
| Ruby | Rails, Sinatra | XV008 |
| Go | html/template, Gin | XV010 |
污染源模式(用户可控数据)
若某变量上下 ±15–20 行内出现以下任一模式,则该变量被判定为“用户可控”:
req.query / req.body / req.params / req.headers (Node.js/Express) request.GET / request.POST / request.args / request.json (Django/Flask) params[ / query_params[ / @query_params (Rails/FastAPI) $_GET[ / $_POST[ / $_REQUEST[ / $_COOKIE[ (PHP) location.search / location.hash / URLSearchParams( (Browser DOM) c.Query( / c.Param( / r.URL.Query( (Go Gin/stdlib)
净化防护模式(自动抑制告警)
以下模式若出现在危险目标(sink)附近,将自动抑制该处告警:
| 防护模式 | 适用上下文 |
|---|---|
DOMPurify.sanitize( |
JS/TS/Vue 中的 DOM XSS |
sanitize_html( |
基于 Python bleach 的净化 |
bleach.clean( |
Python Django |
htmlspecialchars( |
PHP |
htmlentities( |
PHP |
h( / html_escape( |
Rails ERB |
sanitize( |
Rails, Vue |
xss.filterXSS( |
Node.js xss 库 |
escape( |
通用 |
strip_tags( |
PHP / Rails |
CI 集成
# GitHub Actions
- name: XSS audit
run: python3 scripts/xss_audit.py . --format github --ci
# GitLab CI
xss-audit:
script:
- python3 scripts/xss_audit.py . --ci
allow_failure: false
# Pre-commit hook #!/bin/sh python3 ~/.claude/skills/phy-xss-audit/scripts/xss_audit.py . --ci
示例输出
======================================================================
phy-xss-audit — XSS 漏洞扫描报告
======================================================================
总数:3 | CRITICAL:1 | HIGH:2
======================================================================
🔴 [XV005] CRITICAL — Django mark_safe() / autoescape off (CWE-79)
文件 :app/views.py:47
代码 :return mark_safe(request.GET.get('content', ''))
修复 :切勿对用户输入调用 mark_safe()。应先使用 bleach.clean() 净化。
🟠 [XV001] HIGH — innerHTML / outerHTML 中使用用户数据 (CWE-79)
文件 :src/components/Comment.tsx:23
代码 :el.innerHTML = comment.body
修复 :在 innerHTML 赋值前使用 DOMPurify.sanitize(userInput) 进行净化。
🟠 [XV004] HIGH — dangerouslySetInnerHTML 未配合 DOMPurify 使用 (CWE-79)
文件 :src/components/Post.jsx:61
代码 :dangerouslySetInnerHTML={{ __html: post.content }}
修复 :dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.content) }}
OWASP 覆盖情况
本能力覆盖 OWASP A03:2021 — 注入(XSS 向量)。
| OWASP ID | 描述 | 检查项 |
|---|---|---|
| A03:2021 | 注入 — 跨站脚本 | XV001–XV010 |
本技能加入后,phy- suite 的 OWASP Top 10 覆盖情况:
- A01 — phy-path-traversal-audit ✅
- A02 — phy-crypto-audit ✅
- A03 — phy-xss-audit ✅ ← 当前技能
- A04 — phy-cors-audit ✅
- A05 — phy-security-headers ✅
- A06 — phy-dep-upgrade ✅
- A07 — phy-session-audit ✅
- A08 — phy-deserialization-audit ✅
- A09 — phy-otel-audit ✅(可观测性/日志)
- A10 — phy-ssrf-audit ✅
已实现完整的 OWASP Top 10 覆盖。
配套技能
| 技能 | 关联说明 |
|---|---|
phy-cors-audit |
CORS 配置错误 → OWASP A04 |
phy-session-audit |
Cookie/会话安全 → OWASP A07 |
phy-ssrf-audit |
服务端请求伪造 → OWASP A10 |
phy-crypto-audit |
弱密码学实现 → OWASP A02 |
phy-security-headers |
缺失可缓解 XSS 的 CSP 等安全响应头 |
技术说明
- 零外部依赖 — 完全基于 Python 3 标准库(
re、pathlib、argparse、json) - 自动跳过目录:
.git/、node_modules/、__pycache__/、dist/、build/、.venv/ - 编码处理:优先尝试
utf-8,失败则回退至latin-1 - XV003(eval):跳过文件名匹配
*.test.js/*.spec.ts的文件,以降低测试工具误报率 - 邻近窗口(Proximity window):用户输入必须位于危险目标(sink)的 ±10–20 行范围内(各检查项可独立配置)
- 误报抑制:当检测到上述“净化防护模式”在危险目标附近时,自动抑制告警
作者
Canlah AI — 在不损害品牌前提下高效开展效果营销。
- GitHub:github.com/PHY041
- 全部技能:clawhub.ai/PHY041
热门AI工具
相关专题
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。
0
2026.10.22
PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.5万人学习
共6课时 | 54.7万人学习
