针对 JavaScript/TypeScript、React、Vue 等的 XSS 静态漏洞扫描器(OWASP A03:2021),可检测反射、存储和 DOM 型 XSS。
phy-xs- 审计 — XSS 易碎性 Static Scanner. 跨服务器侧渲染,客户端DOM操作等10项检查的跨 Scans 跨空间脚本(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
| 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 |
element.innerHTML = 或 .html()(jQuery)赋值操作,且用户可控数据(如 req.query、req.body、request.GET、location.search 等)在 ±20 行范围内流入,且附近无 DOMPurify.sanitize() 防护。DOMPurify.sanitize(input) 进行净化,或数据来源为内部/静态内容。document.write() 或 document.writeln() 调用传入了用户可控数据。document.write() 仅输出开发者控制的静态字符串(无任何用户输入路径)。eval(userVar)、setTimeout(userVar + "...") 或 new Function(...) 等调用,且参数中直接包含用户数据;测试/规格文件(*.test.js / *.spec.ts)中的此类调用被跳过。eval() 仅用于静态字符串(如 JSON Schema),或用户数据通过安全的 JSON.parse() 传入。dangerouslySetInnerHTML={{ __html: ... }},但该值在 ±5 行范围内未被 DOMPurify.sanitize() 包裹。DOMPurify.sanitize(html) 的返回结果 —— 即代码中在 ±5 行内出现 DOMPurify.sanitize( 模式。mark_safe(user_data) 调用,且用户可控数据在 ±10 行范围内流入;同时,模板中任意位置出现 {% autoescape off %} 均触发告警。mark_safe() 仅包裹开发者定义的静态 HTML 字符串,或数据已先经 bleach.clean() 净化。| safe 过滤器或被 Markup() 包裹,且用户可控数据在 ±10 行范围内流入。| safe 仅用于开发者控制的内容(例如:无用户输入参与的静态站点生成器输出)。echo $_GET['key'] 或 echo $var 等输出语句,且同一行未调用 htmlspecialchars() / htmlentities() / strip_tags() / filter_input() 等函数进行转义。htmlspecialchars($var, ENT_QUOTES, 'UTF-8') 包裹。<%== user_var %>、user_var.html_safe 或 raw user_var,且用户输入在 ±10 行范围内流入,且附近无 sanitize() 或 strip_tags() 防护。h(var) / escape_html(),或用户值被 sanitize() 显式包裹。v-html="someVar",且该值为动态计算所得,且周围 10 行内未见 DOMPurify.sanitize() 调用。v-html 前已通过 DOMPurify.sanitize(rawHtml) 计算得出。bypassSecurityTrustHtml(userVar) 或 bypassSecurityTrustScript(userVar),且用户数据在邻近范围内流入;Go 中对用户可控输入执行 template.HTML(userStr) 或 template.JS(userStr) 类型转换。[innerHTML] 绑定;Go — 交由 html/template 自动处理转义(绝不将用户字符串强制转换为 template.HTML 类型)。| 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 |
# 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 A03:2021 — 注入(XSS 向量)。
| OWASP ID | 描述 | 检查项 |
|---|---|---|
| A03:2021 | 注入 — 跨站脚本 | XV001–XV010 |
本技能加入后,phy- suite 的 OWASP Top 10 覆盖情况:
已实现完整的 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 等安全响应头 |
re、pathlib、argparse、json).git/、node_modules/、__pycache__/、dist/、build/、.venv/utf-8,失败则回退至 latin-1*.test.js / *.spec.ts 的文件,以降低测试工具误报率Canlah AI — 在不损害品牌前提下高效开展效果营销。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习