OWASP Top 10 与注入类漏洞:识别、修复、测试
0. 元信息
- 主题路径:
docs/topics/web-security/subtopics/web-security-owasp-injection/ - 父主题:
web-security - 主分类:安全与可靠性
- 辅助分类:Web 与后端
- 适合对象:会用 Node/Python 写后端 API 与 SQL/NoSQL 查询、懂 HTML/JS 渲染的前后端开发者
- 建议周期:1.5~2 周(每周 8~10 小时,含实验与安全测试)
- 前置知识:
network/rest-api-design;理解 HTTP 请求、cookie、模板渲染 - 最终目标:能对一个故意留漏洞的 demo 完成 OWASP Top 10 全项审查,能用参数化查询、上下文编码、白名单等模式阻断 SQL/XSS/命令/NoSQL/LDAP/XXE 注入,并能用 ZAP + 自写测试持续验证
1. 学习路线
OWASP Top 10 2021 全 10 类概览
→ SQL 注入(UNION、Boolean、时间、堆叠)
→ NoSQL 注入(MongoDB operator)
→ 命令注入(OS 命令拼接)
→ LDAP 注入
→ XML 外部实体(XXE)
→ XSS:反射型、存储型、DOM 型
→ 模板注入(SSTI)与表达式注入
→ 上下文编码与净化(HTML、JS、URL、属性、CSS)
→ Content-Security-Policy 落地
→ 安全测试:单元 + 集成 + ZAP Baseline
2. 阶段周数分配
建议周期 8 周,每周 6 天、每天 1.5~2 小时(每周约 9~12 小时),第 7 天用于复盘和补测:第 1 周基础模型与威胁边界;第 2~3 周核心机制;第 4~5 周防御实现;第 6 周检测、测试与审计;第 7 周综合演练;第 8 周项目收尾、复盘与最终验收。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. OWASP 框架 | Top 10 2021 全 10 类、ASVS、WSTG | 一份自评表,每类 1 行 | 能复述每类的触发条件、影响、最小修复 |
| 2. SQL 注入 | UNION、Boolean、盲注、二阶 SQL | 修复 demo 中 SQL 注入 + 测试 | 用参数化查询阻断所有 4 类 payload |
| 3. NoSQL 注入 | MongoDB $ne / $gt / $where | 修复 NoSQL 注入 | 强制 schema 校验;禁用 $where |
| 4. 命令注入 | exec / spawn / shell 拼接 | 修复命令注入 | 用 execFile 参数化 + 白名单 |
| 5. LDAP / XPath 注入 | 特殊字符过滤 | 修复 LDAP 注入 | 转义或参数化 LDAP 查询 |
| 6. XXE | 外部实体、SSRF、文件读取 | 修复 XXE | 禁用外部实体;用安全的 XML parser |
| 7. XSS 反射型 | URL 参数渲染未转义 | 修复并加 CSP | HTML 上下文编码 + CSP nonce |
| 8. XSS 存储型 | DB 内容渲染到页 | 修复存储型 XSS | 存储前净化;渲染前再编码 |
| 9. XSS DOM 型 | 客户端 sink 接收不可信输入 | 修复 DOM XSS | 禁用 innerHTML;用 DOMPurify + textContent |
关键陷阱:上下文决定编码方式;净化器要按 sink 类型选;CSP 不替代输入校验;模板引擎默认是否安全要逐个查。
4. 第一周:基础与威胁建模(每天 1.5~2 小时)
| Day | 任务 | 产出 | 自检 |
|---|---|---|---|
| 1 | 从 §1 首个知识点画信任边界,列出 5 个资产和 5 个攻击面 | notes/day1.md,含资产/攻击面表 | test -s notes/day1.md && grep -c "攻击面" notes/day1.md 输出 ≥1 |
| 2 | 阅读 §3 阶段 1,针对 3 个概念各写定义、前置条件和失败后果 | notes/day2.md,至少 3 个小节 | grep -c "失败" notes/day2.md 输出 ≥3 |
| 3 | 用本地最小示例复现一个不安全行为,再写修复前后差异 | notes/day3.md 与 notes/day3-output.txt | `test -s notes/day3-output.txt && grep -E “before |
| 4 | 依据 §3 阶段 2 写一张请求/数据流时序图 | notes/day4.md,含 Mermaid 图 | grep -q "mermaid" notes/day4.md |
| 5 | 为 3 个边界条件设计测试,并执行命令记录结果 | notes/day5.md,含输入/期望/实际 | grep -c "期望" notes/day5.md 输出 ≥3 |
| 6 | 将一条防御规则实现为可运行脚本或配置,并记录命令 | notes/day6.sh 或 notes/day6.json、notes/day6.md | test -s notes/day6.md && grep -q "运行" notes/day6.md |
| 7 | 回顾 Day 1~6,写 300 字复盘并列出 10 个自测问答 | notes/week1-retrospective.md | wc -w notes/week1-retrospective.md ≥300 且 grep -c "问:" ≥10 |
5. 阶段通用验收
- 阶段 1 验收:完成概念地图;提交威胁模型;能用 10 分钟解释核心资产、信任边界和主要攻击面。
- 阶段 2 验收:完成核心机制最小实现;提交 3 组正向与负向测试;测试输出包含成功和拒绝结果。
- 阶段 3 验收:完成防御实现;提交配置/代码审计清单;所有高风险输入均经过验证、编码或安全 API。
- 阶段 4 验收:完成检测或安全测试规则;提交日志/扫描/测试输出;能从证据定位触发点和影响范围。
- 阶段 5 验收:完成一次事件或攻击链演练;提交时间线、处置动作和恢复验证;复现者按 README 可独立运行。
- 阶段 6 验收:完成综合项目核心功能;边界测试全通过;README、
notes/design.md、notes/test.md、notes/retrospective.md均存在且非空。 - 阶段 7~8 验收:修复复盘发现的问题;重新执行全部命令;最终报告记录版本、命令和结果。
6. 最终验收
学完后应能完成威胁建模、选择合适的安全机制、实现最小防御链路、编写负面测试、读取日志或扫描证据,并向团队解释安全权衡和残余风险。
量化标准:
- 完成至少 24 道相关练习,其中 12 道基础、8 道中等、4 道综合/高难;每题保留测试或答案证据。
- 独立写出至少 4 个可运行 demo,每个包含成功路径和至少 3 个拒绝/异常测试。
- 完成 1 次 60 分钟攻击—防御演练,能在 15 分钟内讲清威胁模型、核心流程和修复理由。
- 综合项目的自动化检查通过率 100%,高危问题数 0,README 可让他人在 10 分钟内复现。
7. 综合项目
首选项目:安全 Web 服务实验室(本主题对应的 “)。实现一个最小 HTTP/API 服务,故意保留一条可控弱点,再用安全实现和自动化测试修复它。
备选项目:安全审计 CLI。读取请求、配置或依赖清单,输出风险、证据、严重性和修复建议。
必做要求:
- 输入:明确的 JSON/HTTP 请求、配置文件或依赖清单;拒绝缺失字段、超长值、非法编码和越权对象。
- 输出:机器可读 JSON 报告或 API 响应,并包含状态、错误码、证据、修复建议;日志不得泄露密码、令牌或密钥。
- 算法/工具:按 §3 选择标准库安全 API、参数化查询、策略匹配、哈希/签名、规则扫描或事件时间线;在 README 说明选择理由与复杂度/局限。
- 验收标准:成功路径通过;至少 10 个边界/负面测试通过;高风险输入被拒绝;运行静态检查或扫描无新增高危;输出可复现。
项目根目录必须包含 README.md、notes/design.md、notes/test.md、notes/retrospective.md。README 需写需求说明、数据结构/工具选择理由、核心流程、模块化实现、边界测试、编译/运行说明、目录结构和复盘记录;notes/design.md 写威胁模型与流程图,notes/test.md 写每组输入/期望/实际输出,notes/retrospective.md 写用时、难点、收获和下一步。
本主题贡献
- 职责 1(SQL / NoSQL / 命令 / LDAP / XXE 注入全清):故意留漏洞 demo
apps/injection-lab/内 5 类 sink(SQL/NoSQL/command/LDAP/XML),全部用“参数化 + 类型化 + 白名单”修复——SQL 走预编译?/$1(§3 阶段 2、§9.4 #5),NoSQL 走 Zod schema 显式白名单且禁用$where(§3 阶段 3),shell 走execFile(cmd, [args])不传 shell(§3 阶段 4、§9.4 #8),XML 走defusedxml禁用DOCTYPE与外部实体(§3 阶段 6、§9.4 #7)。 - 职责 2(XSS 三型 + 上下文编码 + DOMPurify):反射型 / 存储型 / DOM 型 XSS 分别走“输入校验 + 输出时上下文编码 + DOMPurify”——HTML 内容用 OWASP Encoder HTML,JS 字符串用 JS 编码,URL 用 URL 编码(§3 阶段 7~9、§9.3.5 “Context-aware encoding”);DOM XSS 严禁
innerHTML,统一textContent或 DOMPurify;存储型 XSS 写入前先净化,渲染前再编码(二阶注入防线)。 - 职责 3(CSP nonce 落地 + ZAP Baseline + Semgrep):CSP
script-src 'self' 'nonce-…' 'strict-dynamic'、object-src 'none'、base-uri 'none'、frame-ancestors 'none'(§3 阶段 7、§9.6.3);CI 跑 OWASP ZAP Baseline + Semgrepjavascript.express.security.audit.xss/sql-injection规则集;WSTG payload 表转成 Vitest fixture。 - 交付物 1:
apps/injection-lab/内 6 个故意留漏洞的 endpoint(SQL/NoSQL/cmd/LDAP/XXE/XSS),每个含“before(脆弱实现)+ after(参数化 / 编码 / 白名单)”双版本与 5 条 Vitest 负面用例(UNION、' OR '1'='1'、{"$ne":null}、; rm -rf、<!ENTITY xxe SYSTEM "file:///etc/passwd">、<script>alert(1)</script>)。 - 交付物 2:
packages/safe-render/提供<SafeHTML html={...}>包装 DOMPurify,useSafeURL(url)用白名单协议(http(s):/mailto:),禁止javascript:与data:;escapeForContext(ctx, value)一份上下文编码工具覆盖 HTML / JS 字符串 / URL / 属性 / CSS。 - 交付物 3:CI 中
.github/workflows/sec.yml跑zap-baseline.py+semgrep --config p/owasp-top-ten,高危 0 条才放行;scripts/wstg-fixtures.ts收录 WSTG 6 大类注入向量供单元 / 集成测试使用。 - 交付物 4:
notes/design.md写明“信任边界”——哪些字段来自用户、哪些来自其他服务、哪些必须重新校验(呼应 §9.5 “内部来源可信”误区)。 - 指标 1:ZAP Baseline 在 CI 跑通,高危 alerts = 0;Semgrep
p/owasp-top-ten高危命中 0 条;任一红线即构建失败。 - 指标 2:注入 payload 阻断率 100%——SQLi / NoSQLi / cmdi / XXE / 反射 XSS / 存储 XSS / DOM XSS 各 20 条样本,全部被参数化查询 / 白名单 / 编码 / DOMPurify 拦截(CI 跑回归)。
- 指标 3:CSP 部署到 enforce 模式(不再仅
Report-Only),Content-Security-Policy-Report-Only头在新版本中删除;同时报告中过去 7 天违规数 = 0;任一内联脚本缺 nonce 即 CI 失败。
8. 推荐开源资料
| 阶段 | 角色 | 资料名 | 链接 | 用法 |
|---|---|---|---|---|
| 1 | 入门 | OWASP Web Security Testing Guide | https://owasp.org/www-project-web-security-testing-guide/ | 按主题阅读测试方法并转成自己的检查项 |
| 2 | 官方文档 | MDN Web Security | https://developer.mozilla.org/en-US/docs/Web/Security | 查阅浏览器安全机制、Cookie、CORS、CSP |
| 3 | 规范/标准 | OWASP Cheat Sheet Series | https://cheatsheetseries.owasp.org/ | 实现前逐条对照防御清单 |
| 4 | 工具/源码 | OWASP ZAP | https://www.zaproxy.org/ | 对本地项目做代理扫描,保存报告 |
| 5 | 练习平台 | PortSwigger Web Security Academy | https://portswigger.net/web-security | 完成对应实验并记录请求、漏洞和修复 |
| 6 | 参考标准 | NIST Cybersecurity Framework | https://www.nist.gov/cyberframework | 将检测、响应和恢复动作映射到流程 |
许可证提示:使用 OWASP、ZAP 或其他开源资料与源码前,先打开仓库或页面的 LICENSE/版权说明;默认只引用链接和思路,复制代码时保留版权与许可证文本。
默认使用顺序:先读 §1 与 OWASP 入门资料建立模型 → 用 MDN/规范查 API 和约束 → 在本地项目实现 → 用 ZAP 或对应扫描工具验证 → 到 PortSwigger 做练习 → 将证据和复盘写入
notes/。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
注入类漏洞(A03 Injection)在 OWASP Top 10 长期占据高位。它指的是:用户可控数据被当作代码或指令的一部分执行。形式多种多样,但根因都是同一句话——“把不可信输入当可信字符串拼进了解释器”。
典型表现:
- SQL 注入:把单引号、
' OR '1'='1'、UNION SELECT拼进 SQL,操纵数据库; - NoSQL 注入:把
{"$ne": null}拼进 MongoDB 查询,绕过认证; - 命令注入:把
; rm -rf /拼进 shell 调用; - LDAP 注入:把
*拼进 LDAP filter,绕过权限; - XXE:在 XML 里声明
<!ENTITY xxe SYSTEM "file:///etc/passwd">,让服务端读取文件; - XSS:把
<script>alert(1)</script>拼进 HTML,被浏览器执行。
它之所以高频,是因为:
- 模板、ORM、框架默认不一定安全;
- 不同上下文(HTML/JS/URL/SQL)需要不同编码;
- 业务层常常”信任”了内部来源(数据库、配置文件、其他服务)。
OWASP Top 10 2021 把”注入”列为 A03。本计划把它和 Top 10 框架一起作为整个 Web 安全的入口。
9.2 概念地图
flowchart LR
Top10[OWASP Top 10 2021]
Top10 --> A01
Top10 --> A02
Top10 --> A03[A03 Injection]
Top10 --> A04
Top10 --> A05
Top10 --> A06
Top10 --> A07
Top10 --> A08
Top10 --> A09
Top10 --> A10
A03 --> SQL[SQL Injection]
A03 --> NoSQL[NoSQL Injection]
A03 --> Cmd[OS Command Injection]
A03 --> LDAP[LDAP Injection]
A03 --> XXE[XXE]
A03 --> XSS[XSS]
A03 --> SSTI[SSTI]
A03 --> Header[Header Injection / CRLF]
XSS --> Reflected[反射型]
XSS --> Stored[存储型]
XSS --> DOM[DOM 型]
SQL --> Union[UNION]
SQL --> Boolean[Boolean]
SQL --> Time[时间盲注]
SQL --> Stacked[堆叠]
Fix[修复模式] --> ParamQ[参数化查询]
Fix --> Encode[上下文编码]
Fix --> Allow[白名单]
Fix --> CSP[CSP nonce/hash]
Fix --> Purify[DOMPurify]
Test[安全测试] --> Unit[单测]
Test --> ZAP[ZAP Baseline]
Test --> Semgrep[Semgrep]
关系说明:Top 10 提供风险分类;注入类是其中 A03;每类注入有自己的 payload 与 sink;修复模式按 sink 选;安全测试覆盖每条修复。
9.3 基础知识讲解
9.3.1 经典论文 / 标准
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| OWASP Top 10 2021 — A03 Injection | 风险分类与最小修复 | 5 | https://owasp.org/Top10/A03_2021-Injection/ |
| OWASP SQL Injection Prevention Cheat Sheet | SQL 注入修复 | 5 | https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html |
| OWASP XSS Prevention Cheat Sheet | XSS 修复(上下文编码规则) | 5 | https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html |
| OWASP XXE Prevention Cheat Sheet | XXE 修复 | 4 | https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html |
| OWASP Command Injection Cheat Sheet | 命令注入修复 | 4 | https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html |
| OWASP WSTG — Injection | 测试方法 | 4 | https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/ |
| CWE-89 SQL Injection | 漏洞本体 | 4 | https://cwe.mitre.org/data/definitions/89.html |
| CWE-79 Cross-site Scripting | 漏洞本体 | 4 | https://cwe.mitre.org/data/definitions/79.html |
主推:OWASP SQL/XSS Cheat Sheet。备查:WSTG、CWE 条目、XXE/Command Cheat Sheet。
9.3.2 经典书籍
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| The Web Application Hacker’s Handbook (Stuttard / Pinto) | Web 漏洞方法学 | 5 | https://www.wiley.com/en-us/The+Web+Application+Hacker%27s+Handbook |
| Hacking Exposed Web Applications | 攻击视角 | 4 | https://www.mheducation.com/highered/product/hacking-exposed-web-applications-finchelstein-etal/ |
| The Tangled Web (Michal Zalewski) | 浏览器与脚本安全 | 5 | https://lcamtuf.coredump.cx/tangled/ |
| Web Application Security (Andrew Hoffman) | 现代 XSS/SQL 实战 | 4 | https://www.oreilly.com/library/view/web-application-security/9781492053101/ |
主推:Stuttard《Web Application Hacker’s Handbook》。备查:Zalewski《The Tangled Web》、Hoffman《Web Application Security》。
9.3.3 优秀博客 / 文档
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| PortSwigger Web Security Academy | 互动漏洞实验 | 5 | https://portswigger.net/web-security |
| OWASP Juice Shop | 故意留漏洞 Node demo | 5 | https://github.com/juice-shop/juice-shop |
| Mozilla MDN — XSS | 浏览器侧 XSS 解释 | 4 | https://developer.mozilla.org/en-US/docs/Web/Security |
| DOMPurify | XSS 净化库 | 5 | https://github.com/cure53/DOMPurify |
| sqlmap | SQL 注入检测工具 | 4 | https://github.com/sqlmapproject/sqlmap |
| OWASP ZAP | 开源扫描器 | 5 | https://www.zaproxy.org/ |
主推:PortSwigger Academy + Juice Shop。备查:MDN XSS、DOMPurify、sqlmap。
9.3.4 核心人物
| 人物 | 贡献 | 关键出处 |
|---|---|---|
| Michal Zalewski(p0) | 浏览器模糊测试、XSS 与 SOP | lcamtuf.coredump.cx、The Tangled Web |
| Marcus “rfpixel” Hutchins | 漏洞研究、MalwareTech | blog.malwaretech.com |
| Dafydd Stuttard | Burp Suite、Web App Hacker’s Handbook | portswigger.net |
| Marcus Pinto | Web App Hacker’s Handbook 共同作者 | portswigger.net |
| Mario Heiderich | DOM XSS、Cure53、DOMPurify 维护者 | cure53.de |
| Stefano Di Paola | XSS、DOM 模型 | OWASP 演讲历史 |
主推:Zalewski、Stuttard。备查:Heiderich、Di Paola。
9.3.5 开发方法
| 方法 | 适用 | 关键点 |
|---|---|---|
| Sink-driven | 找漏洞 | 先找危险的 sink(innerHTML、SQL execute、shell exec、XML parse),再追到 source |
| Whitelist over blacklist | 修复 | 用类型、长度、字符集白名单;黑名单永远漏 |
| Context-aware encoding | XSS 修复 | HTML 属性、JS 字符串、URL、HTML 内容用不同编码函数 |
| Parameterized everything | SQL/NoSQL/LDAP | 用预编译语句;不要字符串拼 |
| Safe XML parser config | XXE | 禁用 DOCTYPE、外部实体、XInclude |
| Test the regression | 验证 | 每次修复都加一个失败→通过的测试 |
9.4 经典问题与经典案例
| # | 问题 | 为什么重要 | 最简答案或证据 |
|---|---|---|---|
| 1 | Heartbleed(2014) | OpenSSL 心跳扩展泄露私钥 | 升级 OpenSSL;重新签发证书;撤销旧证书 |
| 2 | Log4Shell(2021) | Log4j JNDI 注入 RCE,CVSS 10.0 | 升级 Log4j ≥ 2.17.1;禁用 JNDI lookup;WAF 临时规则 |
| 3 | XSS via JSONP | 跨域读取用户数据 | 弃用 JSONP;改用 CORS + Authorization 头;CSP default-src 'self' |
| 4 | Samy 蠕虫(2005) | MySpace 上 XSS 蠕虫 24 小时百万用户 | HTML/JS 上下文编码 + CSP + DOMPurify |
| 5 | SQL Slammer(2003) | 蠕虫式 SQL 注入,几十分钟感染 75k 主机 | 参数化查询;最小权限 DB 用户 |
| 6 | 二阶 SQL 注入 | 第一次存储时无害,第二次读取拼接时触发 | 即使存储也要编码/参数化;ORM 不替你保证 |
| 7 | XXE 读 /etc/passwd | XML 默认启用外部实体 | 禁用 DOCTYPE;用 lxml defusedxml |
| 8 | 命令注入到 RCE | exec("ping " + host) | 参数化 execFile;白名单 host |
| 9 | DOM XSS via hash | location.hash 拼到 innerHTML | 用 textContent 或 DOMPurify + scripting 配置 |
| 10 | Template Injection(SSTI) | {{constructor.constructor('return process')()}} | 不让用户输入进模板;用白名单变量 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| OWASP 是分类不是清单 | 看 Top 10 觉得空 | 每类至少跑一个真实漏洞;CWE 编号关联 |
| 上下文编码选错 | HTML 内容用 JS 编码,导致 <img onerror=> 逃逸 | 用 OWASP XSS Cheat Sheet 的 Rule #1~#7 |
| CSP nonce 一加就 break | inline script 没 nonce | 给所有 inline script 加 nonce;考虑迁移到外链 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| “ORM 已经防 SQL 注入了” | ORM 拼接字符串绕过 | 看生成的 SQL;不传字符串到 raw query |
| 修复 XSS 但绕过还在 | 用 replace("<", "") 仍可被 <img src=x onerror=> 绕过 | 用 DOMPurify 而非自写黑名单 |
| “内部来源可信” | 服务间调用也算外部输入 | 画信任边界;每个边界都校验 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 全量改字符串拼接 | 历史代码太多 | 用 Semgrep 扫出所有拼接模式,分批改 |
| CSP 一加前端挂 | inline script 满天飞 | 分阶段:default-src 'self' → 报告模式 → nonce/hash |
| 测试只覆盖 happy path | 没跑过恶意 payload | 把 OWASP WSTG payload 表转成测试夹具 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 组织 | 状态 | 许可证 |
|---|---|---|---|---|
| OWASP Top 10 | 2021 | OWASP | 现行 | CC BY-SA 4.0 |
| OWASP ASVS | 4.0.3 | OWASP | 现行 | CC BY-SA 4.0 |
| CSP Level 3 | CR | W3C | 现行 | 公开 |
| CWE Top 25 | 2023 | MITRE / SANS | 现行 | 公开 |
| DOMPurify | 3.x | Cure53 | 活跃 | Apache-2.0 / MPL-2.0 |
| OWASP ZAP | 2.15+ | OWASP | 活跃 | Apache-2.0 |
9.6.2 Scope
- Top 10:风险分类,每类下有具体漏洞与 CWE;
- ASVS:验收清单,按级别要求;
- CSP:浏览器侧的内容源控制,不替代输入校验;
- DOMPurify:HTML 净化库,按白名单与配置;
- ZAP:黑盒扫描器,能力边界要懂;
- 这些标准/工具不替代人工代码审查与渗透测试。
9.6.3 Structure
必会字段、接口、API:
- HTTP 头:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-...' 'strict-dynamic'; object-src 'none'; base-uri 'none'; - CSP 指令:
default-src、script-src、style-src、img-src、connect-src、frame-ancestors、base-uri、form-action; - SQL 防御:预编译语句 + 类型化参数(如
?、$1、@id); - NoSQL 防御:Joi/Zod schema 校验;MongoDB 显式字段白名单;
- XML 防御:禁用
DOCTYPE、外部实体、XInclude;用defusedxml(Python)或对应安全 parser; - shell 防御:
execFile(cmd, [args])不传 shell;参数白名单; - XSS 净化:DOMPurify 配置项;context-aware 编码函数。
9.6.4 Ecosystem
- 漏洞训练:OWASP Juice Shop、PortSwigger Web Security Academy、DVWA、HackTheBox、TryHackMe;
- 扫描器:OWASP ZAP、Burp Suite Community、sqlmap、Semgrep、njsscan;
- 净化库:DOMPurify(HTML)、sanitize-html、js-xss、owasp-java-html-sanitizer;
- 安全 parser:defusedxml(Python)、Xx-contrib(Ruby)、OWASP ESAPI;
- 事实标准 vs 标准本身:浏览器 CSP 报告 URI 行为、CSP Level 3 实现差异;ORM 默认安全 ≠ 真安全。
9.6.5 Depth Tiers
| 层级 | 能力 |
|---|---|
| L0 | 知道 OWASP Top 10、SQL/XSS 是什么 |
| L1 | 看懂一段含 CSP/参数化查询的代码 |
| L2 | 能为新功能添加参数化查询、CSP、净化库 |
| L3 | 能解释每类注入的 payload 变种、绕过得失,并能写对应测试 |
| L4 | 能设计企业级注入防御规范、S-SDLC 与红蓝对抗 |
本计划目标:L3。
9.6.6 Source
- OWASP 仓库:https://github.com/OWASP/
- W3C CSP:https://www.w3.org/TR/CSP3/
- CWE 数据库:https://cwe.mitre.org/
- NVD CVE:https://nvd.nist.gov/
- 引用版本快照日期:2026-07-30。
10. 常见误区
- 把”加了 CSP”等同安全;CSP 不替代输入校验;
- 用
<script>JSON.parse('${data}')</script>,JSON 里有</script>就 XSS; - 用
escape()或encodeURI()防 XSS;它们不是为 HTML/JS 上下文设计; - 在 SQL 里拼接 LIMIT
$offset;offset 必须是整数; - 用
innerHTML = userInput写”前端简单点”; - 用 MongoDB 直接拼对象
JSON.parse(userInput); - 用黑名单替换
<、script、onerror;永远有遗漏; - 用同一个 sanitizer 处理 HTML、JS、URL、CSS 四种上下文;
- 让 XML parser 默认配置解析不可信输入;
- 让 shell 调用走
exec("cmd " + userInput); - 测试只跑正常 payload,不跑 WSTG 表里的 6 大类注入向量;
- 上线后没有 CSP 报告(
report-uri/report-to),看不到真实世界被攻击情况。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:安全与可靠性 主 + Web 与后端 辅。