@mison/ag-kit-cn 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/.agent/ARCHITECTURE.md +285 -0
- package/.agent/agents/backend-specialist.md +268 -0
- package/.agent/agents/code-archaeologist.md +106 -0
- package/.agent/agents/database-architect.md +225 -0
- package/.agent/agents/debugger.md +225 -0
- package/.agent/agents/devops-engineer.md +242 -0
- package/.agent/agents/documentation-writer.md +104 -0
- package/.agent/agents/explorer-agent.md +73 -0
- package/.agent/agents/frontend-specialist.md +618 -0
- package/.agent/agents/game-developer.md +162 -0
- package/.agent/agents/mobile-developer.md +382 -0
- package/.agent/agents/orchestrator.md +438 -0
- package/.agent/agents/penetration-tester.md +188 -0
- package/.agent/agents/performance-optimizer.md +187 -0
- package/.agent/agents/product-manager.md +112 -0
- package/.agent/agents/product-owner.md +95 -0
- package/.agent/agents/project-planner.md +405 -0
- package/.agent/agents/qa-automation-engineer.md +103 -0
- package/.agent/agents/security-auditor.md +170 -0
- package/.agent/agents/seo-specialist.md +111 -0
- package/.agent/agents/test-engineer.md +158 -0
- package/.agent/mcp_config.json +12 -0
- package/.agent/rules/GEMINI.md +273 -0
- package/.agent/scripts/auto_preview.py +148 -0
- package/.agent/scripts/checklist.py +217 -0
- package/.agent/scripts/session_manager.py +120 -0
- package/.agent/scripts/verify_all.py +327 -0
- package/.agent/skills/api-patterns/SKILL.md +84 -0
- package/.agent/skills/api-patterns/api-style.md +42 -0
- package/.agent/skills/api-patterns/auth.md +24 -0
- package/.agent/skills/api-patterns/documentation.md +26 -0
- package/.agent/skills/api-patterns/graphql.md +41 -0
- package/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/.agent/skills/api-patterns/response.md +37 -0
- package/.agent/skills/api-patterns/rest.md +40 -0
- package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/.agent/skills/api-patterns/security-testing.md +122 -0
- package/.agent/skills/api-patterns/trpc.md +41 -0
- package/.agent/skills/api-patterns/versioning.md +22 -0
- package/.agent/skills/app-builder/SKILL.md +75 -0
- package/.agent/skills/app-builder/agent-coordination.md +74 -0
- package/.agent/skills/app-builder/feature-building.md +53 -0
- package/.agent/skills/app-builder/project-detection.md +34 -0
- package/.agent/skills/app-builder/scaffolding.md +118 -0
- package/.agent/skills/app-builder/tech-stack.md +40 -0
- package/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/.agent/skills/architecture/SKILL.md +57 -0
- package/.agent/skills/architecture/context-discovery.md +43 -0
- package/.agent/skills/architecture/examples.md +94 -0
- package/.agent/skills/architecture/pattern-selection.md +68 -0
- package/.agent/skills/architecture/patterns-reference.md +50 -0
- package/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/.agent/skills/bash-linux/SKILL.md +201 -0
- package/.agent/skills/behavioral-modes/SKILL.md +264 -0
- package/.agent/skills/brainstorming/SKILL.md +164 -0
- package/.agent/skills/brainstorming/dynamic-questioning.md +359 -0
- package/.agent/skills/clean-code/SKILL.md +200 -0
- package/.agent/skills/code-review-checklist/SKILL.md +125 -0
- package/.agent/skills/database-design/SKILL.md +54 -0
- package/.agent/skills/database-design/database-selection.md +43 -0
- package/.agent/skills/database-design/indexing.md +39 -0
- package/.agent/skills/database-design/migrations.md +50 -0
- package/.agent/skills/database-design/optimization.md +36 -0
- package/.agent/skills/database-design/orm-selection.md +30 -0
- package/.agent/skills/database-design/schema-design.md +56 -0
- package/.agent/skills/database-design/scripts/schema_validator.py +172 -0
- package/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/.agent/skills/doc.md +177 -0
- package/.agent/skills/documentation-templates/SKILL.md +194 -0
- package/.agent/skills/frontend-design/SKILL.md +418 -0
- package/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/.agent/skills/frontend-design/color-system.md +307 -0
- package/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/.agent/skills/frontend-design/scripts/ux_audit.py +727 -0
- package/.agent/skills/frontend-design/typography-system.md +345 -0
- package/.agent/skills/frontend-design/ux-psychology.md +1118 -0
- package/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/.agent/skills/game-development/2d-games/SKILL.md +119 -0
- package/.agent/skills/game-development/3d-games/SKILL.md +135 -0
- package/.agent/skills/game-development/SKILL.md +167 -0
- package/.agent/skills/game-development/game-art/SKILL.md +185 -0
- package/.agent/skills/game-development/game-audio/SKILL.md +190 -0
- package/.agent/skills/game-development/game-design/SKILL.md +129 -0
- package/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
- package/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
- package/.agent/skills/game-development/pc-games/SKILL.md +144 -0
- package/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
- package/.agent/skills/game-development/web-games/SKILL.md +150 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +155 -0
- package/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/.agent/skills/intelligent-routing/SKILL.md +335 -0
- package/.agent/skills/lint-and-validate/SKILL.md +44 -0
- package/.agent/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/.agent/skills/mobile-design/SKILL.md +394 -0
- package/.agent/skills/mobile-design/decision-trees.md +516 -0
- package/.agent/skills/mobile-design/mobile-backend.md +491 -0
- package/.agent/skills/mobile-design/mobile-color-system.md +420 -0
- package/.agent/skills/mobile-design/mobile-debugging.md +122 -0
- package/.agent/skills/mobile-design/mobile-design-thinking.md +355 -0
- package/.agent/skills/mobile-design/mobile-navigation.md +458 -0
- package/.agent/skills/mobile-design/mobile-performance.md +767 -0
- package/.agent/skills/mobile-design/mobile-testing.md +356 -0
- package/.agent/skills/mobile-design/mobile-typography.md +432 -0
- package/.agent/skills/mobile-design/platform-android.md +666 -0
- package/.agent/skills/mobile-design/platform-ios.md +561 -0
- package/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/.agent/skills/mobile-design/touch-psychology.md +537 -0
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +311 -0
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +241 -0
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +489 -0
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +263 -0
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +431 -0
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +683 -0
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +149 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +286 -0
- package/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
- package/.agent/skills/parallel-agents/SKILL.md +194 -0
- package/.agent/skills/performance-profiling/SKILL.md +149 -0
- package/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/.agent/skills/plan-writing/SKILL.md +152 -0
- package/.agent/skills/powershell-windows/SKILL.md +166 -0
- package/.agent/skills/python-patterns/SKILL.md +441 -0
- package/.agent/skills/red-team-tactics/SKILL.md +203 -0
- package/.agent/skills/rust-pro/SKILL.md +190 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +135 -0
- package/.agent/skills/seo-fundamentals/scripts/seo_checker.py +215 -0
- package/.agent/skills/server-management/SKILL.md +161 -0
- package/.agent/skills/systematic-debugging/SKILL.md +114 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +269 -0
- package/.agent/skills/tdd-workflow/SKILL.md +149 -0
- package/.agent/skills/testing-patterns/SKILL.md +178 -0
- package/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
- package/.agent/skills/vulnerability-scanner/checklists.md +131 -0
- package/.agent/skills/vulnerability-scanner/scripts/security_scan.py +459 -0
- package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
- package/.agent/skills/webapp-testing/SKILL.md +187 -0
- package/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/.agent/workflows/brainstorm.md +113 -0
- package/.agent/workflows/create.md +59 -0
- package/.agent/workflows/debug.md +103 -0
- package/.agent/workflows/deploy.md +176 -0
- package/.agent/workflows/enhance.md +63 -0
- package/.agent/workflows/orchestrate.md +242 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +80 -0
- package/.agent/workflows/restore-localize-compat.md +525 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +295 -0
- package/AGENT_FLOW.md +609 -0
- package/CHANGELOG.md +68 -0
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/adapters/base.js +63 -0
- package/bin/adapters/codex.js +391 -0
- package/bin/adapters/gemini.js +137 -0
- package/bin/ag-kit.js +1336 -0
- package/bin/core/builder.js +80 -0
- package/bin/core/generator.js +59 -0
- package/bin/core/resource-loader.js +64 -0
- package/bin/core/transformer.js +208 -0
- package/bin/interactive.js +65 -0
- package/bin/utils/atomic-writer.js +97 -0
- package/bin/utils/git-helper.js +68 -0
- package/bin/utils/managed-block.js +65 -0
- package/bin/utils/manifest.js +241 -0
- package/bin/utils.js +82 -0
- package/docs/codex-rules-template.md +36 -0
- package/docs/mapping-spec.md +68 -0
- package/docs/multi-target-adapter.md +80 -0
- package/docs/official/README.md +53 -0
- package/docs/official/antigravity/agent-modes-settings.md +64 -0
- package/docs/official/antigravity/rules-workflows.md +96 -0
- package/docs/official/antigravity/skills.md +147 -0
- package/docs/official/codex/agents-md.md +119 -0
- package/docs/official/codex/config-advanced.md +358 -0
- package/docs/official/codex/config-basic.md +141 -0
- package/docs/official/codex/config-reference.md +223 -0
- package/docs/official/codex/config-sample.md +216 -0
- package/docs/official/codex/mcp.md +107 -0
- package/docs/official/codex/rules.md +79 -0
- package/docs/official/codex/skills.md +114 -0
- package/docs/official/sources-index.md +32 -0
- package/docs/operations.md +145 -0
- package/docs/terminology-style-guide.md +69 -0
- package/package.json +51 -0
- package/scripts/postinstall-check.js +112 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-patterns
|
|
3
|
+
description: API design principles and decision-making(API 设计原则与决策逻辑)。REST vs GraphQL vs tRPC selection(选择)、response formats(响应格式)、versioning(版本控制)、pagination(分页)。
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# API Patterns(API 模式)
|
|
8
|
+
|
|
9
|
+
> API design principles and decision-making for 2025(2025 年 API 设计原则与决策逻辑)。
|
|
10
|
+
> **Learn to THINK, not copy fixed patterns(学习如何思考,而非机械复制固定模式)。**
|
|
11
|
+
|
|
12
|
+
## 🎯 选择性阅读规则(Selective Reading Rule)
|
|
13
|
+
|
|
14
|
+
**仅阅读与当前请求相关的文件(Read ONLY files relevant to the request)!** 查阅内容地图并定位所需章节(Check the content map, find what you need)。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 📑 内容地图(Content Map)
|
|
19
|
+
|
|
20
|
+
| File(文件) | Description(描述) | When to Read(阅读时机) |
|
|
21
|
+
| ---- | ---- | -------- |
|
|
22
|
+
| `api-style.md` | REST vs GraphQL vs tRPC decision tree(决策树) | Choosing API type(选择 API 类型时) |
|
|
23
|
+
| `rest.md` | Resource naming, HTTP methods, status codes(资源命名/HTTP 方法/状态码) | Designing REST API(设计 REST API 时) |
|
|
24
|
+
| `response.md` | Envelope pattern, error format, pagination(信封模式/错误格式/分页) | Response structure(确定响应结构时) |
|
|
25
|
+
| `graphql.md` | Schema design, when to use, security(模式设计/使用场景/安全性) | Considering GraphQL(考虑 GraphQL 时) |
|
|
26
|
+
| `trpc.md` | TypeScript monorepo, type safety(TS 单仓/类型安全) | TS fullstack projects(TS 全栈项目) |
|
|
27
|
+
| `versioning.md` | URI/Header/Query versioning(URI/请求头/查询参数版本控制) | API evolution planning(规划 API 演进) |
|
|
28
|
+
| `auth.md` | JWT, OAuth, Passkey, API Keys(认证方案) | Auth pattern selection(选择认证模式) |
|
|
29
|
+
| `rate-limiting.md` | Token bucket, sliding window(令牌桶/滑动窗口) | API protection(API 保护机制) |
|
|
30
|
+
| `documentation.md` | OpenAPI/Swagger best practices(文档规范) | Documentation(编写 API 文档) |
|
|
31
|
+
| `security-testing.md` | OWASP API Top 10, auth/authz testing(认证/授权测试) | Security audits(安全审计) |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🔗 相关技能(Related Skills)
|
|
36
|
+
|
|
37
|
+
| Need(需求) | Skill(技能) |
|
|
38
|
+
| ---- | ------------ |
|
|
39
|
+
| API implementation(API 落地实现) | `@[skills/backend-development]` |
|
|
40
|
+
| Data structure(数据库结构设计) | `@[skills/database-design]` |
|
|
41
|
+
| Security details(安全加固细节) | `@[skills/security-hardening]` |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## ✅ 决策检查清单(Decision Checklist)
|
|
46
|
+
|
|
47
|
+
设计 API 之前(Before designing an API):
|
|
48
|
+
|
|
49
|
+
- [ ] **Asked user about API consumers?(是否询问 API 消费者?)**
|
|
50
|
+
- [ ] **Chosen API style for THIS context?(是否为当前上下文选择 API 风格?)** (REST/GraphQL/tRPC)
|
|
51
|
+
- [ ] **Defined consistent response format?(是否定义统一响应格式?)**
|
|
52
|
+
- [ ] **Planned versioning strategy?(是否规划版本控制策略?)**
|
|
53
|
+
- [ ] **Considered authentication needs?(是否考虑认证需求?)**
|
|
54
|
+
- [ ] **Planned rate limiting?(是否规划频率限制?)**
|
|
55
|
+
- [ ] **Documentation approach defined?(是否定义文档方案?)**
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## ❌ 反模式(Anti-Patterns)
|
|
60
|
+
|
|
61
|
+
**不要(DON'T):**
|
|
62
|
+
|
|
63
|
+
- 任何场景都默认 REST(Default to REST for everything)。
|
|
64
|
+
- REST 端点使用动词,如 `/getUsers`(Use verbs in REST endpoints)。
|
|
65
|
+
- 响应格式不一致(Return inconsistent response formats)。
|
|
66
|
+
- 向客户端暴露内部错误(Expose internal errors to clients)。
|
|
67
|
+
- 忽略频率限制(Skip rate limiting)。
|
|
68
|
+
|
|
69
|
+
**推荐做法(DO):**
|
|
70
|
+
|
|
71
|
+
- 根据上下文选择 API 风格(Choose API style based on context)。
|
|
72
|
+
- 先询问客户端需求(Ask about client requirements)。
|
|
73
|
+
- 编写详尽文档(Document thoroughly)。
|
|
74
|
+
- 使用合适的 HTTP 状态码(Use appropriate status codes)。
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 运行脚本(Script)
|
|
79
|
+
|
|
80
|
+
| Script(脚本) | Purpose(用途) | Command(命令) |
|
|
81
|
+
| ---- | ---- | ---- |
|
|
82
|
+
| `scripts/api_validator.py` | API endpoint validation(API 端点校验) | `python scripts/api_validator.py <project_path>`(项目路径) |
|
|
83
|
+
|
|
84
|
+
---
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# API 风格选择(2025)
|
|
2
|
+
|
|
3
|
+
> REST vs GraphQL vs tRPC —— 在什么情况下选择哪种?
|
|
4
|
+
|
|
5
|
+
## 决策树
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
谁是 API 消费者?
|
|
9
|
+
│
|
|
10
|
+
├── 公共 API / 多平台支持
|
|
11
|
+
│ └── REST + OpenAPI(接口规范,最广泛的兼容性)
|
|
12
|
+
│
|
|
13
|
+
├── 数据需求复杂 / 多个前端
|
|
14
|
+
│ └── GraphQL(灵活的查询)
|
|
15
|
+
│
|
|
16
|
+
├── TypeScript(TS)前端 + 后端(monorepo,单仓)
|
|
17
|
+
│ └── tRPC(端到端类型安全)
|
|
18
|
+
│
|
|
19
|
+
├── 实时性 / 事件驱动
|
|
20
|
+
│ └── WebSocket + AsyncAPI(异步 API 规范)
|
|
21
|
+
│
|
|
22
|
+
└── 内部微服务
|
|
23
|
+
└── gRPC(追求性能)或 REST(追求简单)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 对比
|
|
27
|
+
|
|
28
|
+
| 因素 | REST | GraphQL | tRPC |
|
|
29
|
+
| :--- | :--- | :------ | :--- |
|
|
30
|
+
| **最佳适用** | 公共 API | 复杂应用 | TS monorepos(TypeScript 单仓) |
|
|
31
|
+
| **学习曲线** | 低 | 中 | 低(如果是 TS 用户) |
|
|
32
|
+
| **过度/不足获取** | 常见(over/under fetching) | 已解决 | 已解决 |
|
|
33
|
+
| **类型安全** | 手动(OpenAPI) | 基于 Schema(模式) | 自动 |
|
|
34
|
+
| **缓存** | HTTP 原生支持 | 复杂 | 基于客户端 |
|
|
35
|
+
|
|
36
|
+
## 选择问题
|
|
37
|
+
|
|
38
|
+
1. 谁是 API 消费者?
|
|
39
|
+
2. 前端是 TypeScript(TS)吗?
|
|
40
|
+
3. 数据关系有多复杂?
|
|
41
|
+
4. 缓存是否至关重要?
|
|
42
|
+
5. 是公共 API 还是内部 API?
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 认证模式
|
|
2
|
+
|
|
3
|
+
> 根据用例选择认证模式。
|
|
4
|
+
|
|
5
|
+
## 选择指南
|
|
6
|
+
|
|
7
|
+
| 模式 | 最佳适用场景 |
|
|
8
|
+
| :--- | :----------- |
|
|
9
|
+
| **JWT(JSON Web Token)** | 无状态、微服务架构 |
|
|
10
|
+
| **Session(会话)** | 传统 Web 应用、简单场景 |
|
|
11
|
+
| **OAuth 2.0(授权协议)** | 第三方集成 |
|
|
12
|
+
| **API Keys(API 密钥)** | 服务器间通信、公共 API |
|
|
13
|
+
| **Passkey(通行密钥)** | 现代无密码认证(2025+) |
|
|
14
|
+
|
|
15
|
+
## JWT(JSON Web Token)原则
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
重要事项:
|
|
19
|
+
├── 始终验证签名
|
|
20
|
+
├── 检查过期时间
|
|
21
|
+
├── 仅包含最小必要的声明(Claims)
|
|
22
|
+
├── 使用短过期时间 + 刷新令牌(Refresh tokens)
|
|
23
|
+
└── 绝不在 JWT 中存储敏感数据
|
|
24
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# API 文档编写原则
|
|
2
|
+
|
|
3
|
+
> 好的文档 = 快乐的开发者 = API 被广泛采用。
|
|
4
|
+
|
|
5
|
+
## OpenAPI/Swagger 精要
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
应包含:
|
|
9
|
+
├── 所有端点(Endpoints)及其示例
|
|
10
|
+
├── 请求/响应 Schema(模式)
|
|
11
|
+
├── 认证要求
|
|
12
|
+
├── 错误响应格式
|
|
13
|
+
└── 速率限制信息
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 优质文档包含
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
核心要素:
|
|
20
|
+
├── 快速开始 / 入门指南
|
|
21
|
+
├── 认证指南
|
|
22
|
+
├── 完整的 API 参考手册
|
|
23
|
+
├── 错误处理指南
|
|
24
|
+
├── 代码示例(多种语言)
|
|
25
|
+
└── 更新日志(Changelog)
|
|
26
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# GraphQL(图查询语言)原则
|
|
2
|
+
|
|
3
|
+
> 为复杂、互联的数据提供灵活的查询。
|
|
4
|
+
|
|
5
|
+
## 何时使用
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
✅ 适用场景:
|
|
9
|
+
├── 数据关系复杂且互相连接
|
|
10
|
+
├── 有多个前端平台
|
|
11
|
+
├── 客户端需要灵活的查询
|
|
12
|
+
├── 数据需求在不断演进
|
|
13
|
+
└── 减少“过度获取(over-fetching)”非常重要
|
|
14
|
+
|
|
15
|
+
❌ 不适用场景:
|
|
16
|
+
├── 简单的 CRUD(增删改查)操作
|
|
17
|
+
├── 包含大量的文件上传
|
|
18
|
+
├── HTTP(超文本传输协议)级缓存非常重要
|
|
19
|
+
└── 团队对 GraphQL(图查询语言)不熟悉
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Schema(模式)设计原则
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
设计原则:
|
|
26
|
+
├── 以图(Graph)的方式思考,而不是端点(Endpoints)
|
|
27
|
+
├── 设计要有可演进性(通常无版本号)
|
|
28
|
+
├── 使用 Connections(连接)模式进行分页
|
|
29
|
+
├── 类型定义要具体(不要使用通用的 "data")
|
|
30
|
+
└── 深思熟虑地处理空值(Nullability)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 安全考量
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
防范措施:
|
|
37
|
+
├── 查询深度攻击(Query depth attacks) → 设置最大深度
|
|
38
|
+
├── 查询复杂度(Query complexity) → 计算查询成本
|
|
39
|
+
├── 批量滥用(Batching abuse) → 限制批量大小
|
|
40
|
+
└── 内省(Introspection) → 生产环境禁用
|
|
41
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 限流原则
|
|
2
|
+
|
|
3
|
+
> 保护你的 API(接口)免受滥用和过载。
|
|
4
|
+
|
|
5
|
+
## 为什么要限流
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
防范措施:
|
|
9
|
+
├── 暴力破解攻击
|
|
10
|
+
├── 资源耗尽
|
|
11
|
+
├── 成本超支(如果是按量计费)
|
|
12
|
+
└── 不公平的使用
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 策略选择
|
|
16
|
+
|
|
17
|
+
| 类型 | 机制 | 适用场景 |
|
|
18
|
+
| :--- | :--- | :------- |
|
|
19
|
+
| **令牌桶(Token bucket)** | 允许突发流量,随时间填充 | 大多数 API |
|
|
20
|
+
| **滑动窗口(Sliding window)** | 平滑分布 | 严格限制 |
|
|
21
|
+
| **固定窗口(Fixed window)** | 每个窗口的简单计数器 | 基本需求 |
|
|
22
|
+
|
|
23
|
+
## 响应头
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
要在响应头中包含:
|
|
27
|
+
├── X-RateLimit-Limit(最大请求数)
|
|
28
|
+
├── X-RateLimit-Remaining(剩余请求数)
|
|
29
|
+
├── X-RateLimit-Reset(重置时间)
|
|
30
|
+
└── 超出限制时返回 429
|
|
31
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 响应格式原则
|
|
2
|
+
|
|
3
|
+
> 一致性是关键——选择一种格式并坚持使用。
|
|
4
|
+
|
|
5
|
+
## 常见模式
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
请选择一种:
|
|
9
|
+
├── 信封模式(Envelope pattern): { success, data, error }
|
|
10
|
+
├── 直接返回数据(Direct data): 仅返回资源内容
|
|
11
|
+
└── HAL/JSON:API(超媒体模式)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 错误响应
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
应包含:
|
|
18
|
+
├── 错误代码(Error code): 用于程序化处理
|
|
19
|
+
├── 用户消息(User message): 用于界面显示
|
|
20
|
+
├── 详细信息(Details): 用于调试、字段级错误
|
|
21
|
+
├── 请求 ID(Request ID): 用于支持查询
|
|
22
|
+
└── 绝不包含内部实现细节(安全隐患)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 分页类型
|
|
26
|
+
|
|
27
|
+
| 类型 | 最佳适用场景 | 权衡 |
|
|
28
|
+
| :--- | :----------- | :---------------- |
|
|
29
|
+
| **Offset(偏移量)** | 简单,支持跳转页码 | 大数据集性能差 |
|
|
30
|
+
| **Cursor(游标)** | 大数据集,无限滚动 | 无法跳转特定页 |
|
|
31
|
+
| **Keyset(键集)** | 性能至关重要 | 需要可排序的键 |
|
|
32
|
+
|
|
33
|
+
### 选择问题
|
|
34
|
+
|
|
35
|
+
1. 数据集有多大?
|
|
36
|
+
2. 用户需要跳转到特定页面吗?
|
|
37
|
+
3. 数据是否频繁变化?
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# REST(表述性状态转移)原则
|
|
2
|
+
|
|
3
|
+
> 基于资源的 API(接口)设计——使用名词而非动词。
|
|
4
|
+
|
|
5
|
+
## 资源命名规则
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
设计原则:
|
|
9
|
+
├── 使用名词,而非动词(资源,而非动作)
|
|
10
|
+
├── 使用复数形式(/users 而不是 /user)
|
|
11
|
+
├── 使用小写,连字符分隔(/user-profiles)
|
|
12
|
+
├── 使用嵌套表示关系(/users/123/posts)
|
|
13
|
+
└── 保持浅层嵌套(建议最多 3 层)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## HTTP(超文本传输协议)方法选择
|
|
17
|
+
|
|
18
|
+
| 方法 | 目的 | 是否幂等(Idempotent)? | 是否包含请求体(Body)? |
|
|
19
|
+
| :--- | :--- | :--------- | :----------------------- |
|
|
20
|
+
| **GET** | 读取资源 | 是 | 否 |
|
|
21
|
+
| **POST** | 创建新资源 | 否 | 是 |
|
|
22
|
+
| **PUT** | 替换整个资源 | 是 | 是 |
|
|
23
|
+
| **PATCH** | 部分更新资源 | 否 | 是 |
|
|
24
|
+
| **DELETE** | 删除资源 | 是 | 否 |
|
|
25
|
+
|
|
26
|
+
## 状态码选择
|
|
27
|
+
|
|
28
|
+
| 场景 | 代码 | 原因 |
|
|
29
|
+
| :--- | :--- | :--- |
|
|
30
|
+
| 成功(读取) | 200 | 标准成功响应 |
|
|
31
|
+
| 已创建 | 201 | 新资源已创建 |
|
|
32
|
+
| 无内容 | 204 | 操作成功,无需返回内容 |
|
|
33
|
+
| 错误请求 | 400 | 请求格式错误 |
|
|
34
|
+
| 未授权 | 401 | 缺少认证信息或无效 |
|
|
35
|
+
| 禁止访问 | 403 | 认证有效,但无权限 |
|
|
36
|
+
| 未找到 | 404 | 资源不存在 |
|
|
37
|
+
| 冲突 | 409 | 状态冲突(如重复资源) |
|
|
38
|
+
| 验证错误 | 422 | 语法正确,但数据无效 |
|
|
39
|
+
| 速率限制 | 429 | 请求过多 |
|
|
40
|
+
| 服务器错误 | 500 | 服务器内部错误 |
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
API Validator - Checks API endpoints for best practices.
|
|
4
|
+
Validates OpenAPI specs, response formats, and common issues.
|
|
5
|
+
"""
|
|
6
|
+
import sys
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
# Fix Windows console encoding for Unicode output
|
|
12
|
+
try:
|
|
13
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
14
|
+
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
15
|
+
except AttributeError:
|
|
16
|
+
pass # Python < 3.7
|
|
17
|
+
|
|
18
|
+
def find_api_files(project_path: Path) -> list:
|
|
19
|
+
"""Find API-related files."""
|
|
20
|
+
patterns = [
|
|
21
|
+
"**/*api*.ts", "**/*api*.js", "**/*api*.py",
|
|
22
|
+
"**/routes/*.ts", "**/routes/*.js", "**/routes/*.py",
|
|
23
|
+
"**/controllers/*.ts", "**/controllers/*.js",
|
|
24
|
+
"**/endpoints/*.ts", "**/endpoints/*.py",
|
|
25
|
+
"**/*.openapi.json", "**/*.openapi.yaml",
|
|
26
|
+
"**/swagger.json", "**/swagger.yaml",
|
|
27
|
+
"**/openapi.json", "**/openapi.yaml"
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
files = []
|
|
31
|
+
for pattern in patterns:
|
|
32
|
+
files.extend(project_path.glob(pattern))
|
|
33
|
+
|
|
34
|
+
# Exclude node_modules, etc.
|
|
35
|
+
return [f for f in files if not any(x in str(f) for x in ['node_modules', '.git', 'dist', 'build', '__pycache__'])]
|
|
36
|
+
|
|
37
|
+
def check_openapi_spec(file_path: Path) -> dict:
|
|
38
|
+
"""Check OpenAPI/Swagger specification."""
|
|
39
|
+
issues = []
|
|
40
|
+
passed = []
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
content = file_path.read_text(encoding='utf-8')
|
|
44
|
+
|
|
45
|
+
if file_path.suffix == '.json':
|
|
46
|
+
spec = json.loads(content)
|
|
47
|
+
else:
|
|
48
|
+
# Basic YAML check
|
|
49
|
+
if 'openapi:' in content or 'swagger:' in content:
|
|
50
|
+
passed.append("[OK] OpenAPI/Swagger version defined")
|
|
51
|
+
else:
|
|
52
|
+
issues.append("[X] No OpenAPI version found")
|
|
53
|
+
|
|
54
|
+
if 'paths:' in content:
|
|
55
|
+
passed.append("[OK] Paths section exists")
|
|
56
|
+
else:
|
|
57
|
+
issues.append("[X] No paths defined")
|
|
58
|
+
|
|
59
|
+
if 'components:' in content or 'definitions:' in content:
|
|
60
|
+
passed.append("[OK] Schema components defined")
|
|
61
|
+
|
|
62
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'openapi'}
|
|
63
|
+
|
|
64
|
+
# JSON OpenAPI checks
|
|
65
|
+
if 'openapi' in spec or 'swagger' in spec:
|
|
66
|
+
passed.append("[OK] OpenAPI version defined")
|
|
67
|
+
|
|
68
|
+
if 'info' in spec:
|
|
69
|
+
if 'title' in spec['info']:
|
|
70
|
+
passed.append("[OK] API title defined")
|
|
71
|
+
if 'version' in spec['info']:
|
|
72
|
+
passed.append("[OK] API version defined")
|
|
73
|
+
if 'description' not in spec['info']:
|
|
74
|
+
issues.append("[!] API description missing")
|
|
75
|
+
|
|
76
|
+
if 'paths' in spec:
|
|
77
|
+
path_count = len(spec['paths'])
|
|
78
|
+
passed.append(f"[OK] {path_count} endpoints defined")
|
|
79
|
+
|
|
80
|
+
# Check each path
|
|
81
|
+
for path, methods in spec['paths'].items():
|
|
82
|
+
for method, details in methods.items():
|
|
83
|
+
if method in ['get', 'post', 'put', 'patch', 'delete']:
|
|
84
|
+
if 'responses' not in details:
|
|
85
|
+
issues.append(f"[X] {method.upper()} {path}: No responses defined")
|
|
86
|
+
if 'summary' not in details and 'description' not in details:
|
|
87
|
+
issues.append(f"[!] {method.upper()} {path}: No description")
|
|
88
|
+
|
|
89
|
+
except Exception as e:
|
|
90
|
+
issues.append(f"[X] Parse error: {e}")
|
|
91
|
+
|
|
92
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'openapi'}
|
|
93
|
+
|
|
94
|
+
def check_api_code(file_path: Path) -> dict:
|
|
95
|
+
"""Check API code for common issues."""
|
|
96
|
+
issues = []
|
|
97
|
+
passed = []
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
content = file_path.read_text(encoding='utf-8')
|
|
101
|
+
|
|
102
|
+
# Check for error handling
|
|
103
|
+
error_patterns = [
|
|
104
|
+
r'try\s*{', r'try:', r'\.catch\(',
|
|
105
|
+
r'except\s+', r'catch\s*\('
|
|
106
|
+
]
|
|
107
|
+
has_error_handling = any(re.search(p, content) for p in error_patterns)
|
|
108
|
+
if has_error_handling:
|
|
109
|
+
passed.append("[OK] Error handling present")
|
|
110
|
+
else:
|
|
111
|
+
issues.append("[X] No error handling found")
|
|
112
|
+
|
|
113
|
+
# Check for status codes
|
|
114
|
+
status_patterns = [
|
|
115
|
+
r'status\s*\(\s*\d{3}\s*\)', r'statusCode\s*[=:]\s*\d{3}',
|
|
116
|
+
r'HttpStatus\.', r'status_code\s*=\s*\d{3}',
|
|
117
|
+
r'\.status\(\d{3}\)', r'res\.status\('
|
|
118
|
+
]
|
|
119
|
+
has_status = any(re.search(p, content) for p in status_patterns)
|
|
120
|
+
if has_status:
|
|
121
|
+
passed.append("[OK] HTTP status codes used")
|
|
122
|
+
else:
|
|
123
|
+
issues.append("[!] No explicit HTTP status codes")
|
|
124
|
+
|
|
125
|
+
# Check for validation
|
|
126
|
+
validation_patterns = [
|
|
127
|
+
r'validate', r'schema', r'zod', r'joi', r'yup',
|
|
128
|
+
r'pydantic', r'@Body\(', r'@Query\('
|
|
129
|
+
]
|
|
130
|
+
has_validation = any(re.search(p, content, re.I) for p in validation_patterns)
|
|
131
|
+
if has_validation:
|
|
132
|
+
passed.append("[OK] Input validation present")
|
|
133
|
+
else:
|
|
134
|
+
issues.append("[!] No input validation detected")
|
|
135
|
+
|
|
136
|
+
# Check for auth middleware
|
|
137
|
+
auth_patterns = [
|
|
138
|
+
r'auth', r'jwt', r'bearer', r'token',
|
|
139
|
+
r'middleware', r'guard', r'@Authenticated'
|
|
140
|
+
]
|
|
141
|
+
has_auth = any(re.search(p, content, re.I) for p in auth_patterns)
|
|
142
|
+
if has_auth:
|
|
143
|
+
passed.append("[OK] Authentication/authorization detected")
|
|
144
|
+
|
|
145
|
+
# Check for rate limiting
|
|
146
|
+
rate_patterns = [r'rateLimit', r'throttle', r'rate.?limit']
|
|
147
|
+
has_rate = any(re.search(p, content, re.I) for p in rate_patterns)
|
|
148
|
+
if has_rate:
|
|
149
|
+
passed.append("[OK] Rate limiting present")
|
|
150
|
+
|
|
151
|
+
# Check for logging
|
|
152
|
+
log_patterns = [r'console\.log', r'logger\.', r'logging\.', r'log\.']
|
|
153
|
+
has_logging = any(re.search(p, content) for p in log_patterns)
|
|
154
|
+
if has_logging:
|
|
155
|
+
passed.append("[OK] Logging present")
|
|
156
|
+
|
|
157
|
+
except Exception as e:
|
|
158
|
+
issues.append(f"[X] Read error: {e}")
|
|
159
|
+
|
|
160
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'code'}
|
|
161
|
+
|
|
162
|
+
def main():
|
|
163
|
+
target = sys.argv[1] if len(sys.argv) > 1 else "."
|
|
164
|
+
project_path = Path(target)
|
|
165
|
+
|
|
166
|
+
print("\n" + "=" * 60)
|
|
167
|
+
print(" API VALIDATOR - Endpoint Best Practices Check")
|
|
168
|
+
print("=" * 60 + "\n")
|
|
169
|
+
|
|
170
|
+
api_files = find_api_files(project_path)
|
|
171
|
+
|
|
172
|
+
if not api_files:
|
|
173
|
+
print("[!] No API files found.")
|
|
174
|
+
print(" Looking for: routes/, controllers/, api/, openapi.json/yaml")
|
|
175
|
+
sys.exit(0)
|
|
176
|
+
|
|
177
|
+
results = []
|
|
178
|
+
for file_path in api_files[:15]: # Limit
|
|
179
|
+
if 'openapi' in file_path.name.lower() or 'swagger' in file_path.name.lower():
|
|
180
|
+
result = check_openapi_spec(file_path)
|
|
181
|
+
else:
|
|
182
|
+
result = check_api_code(file_path)
|
|
183
|
+
results.append(result)
|
|
184
|
+
|
|
185
|
+
# Print results
|
|
186
|
+
total_issues = 0
|
|
187
|
+
total_passed = 0
|
|
188
|
+
|
|
189
|
+
for result in results:
|
|
190
|
+
print(f"\n[FILE] {result['file']} [{result['type']}]")
|
|
191
|
+
for item in result['passed']:
|
|
192
|
+
print(f" {item}")
|
|
193
|
+
total_passed += 1
|
|
194
|
+
for item in result['issues']:
|
|
195
|
+
print(f" {item}")
|
|
196
|
+
if item.startswith("[X]"):
|
|
197
|
+
total_issues += 1
|
|
198
|
+
|
|
199
|
+
print("\n" + "=" * 60)
|
|
200
|
+
print(f"[RESULTS] {total_passed} passed, {total_issues} critical issues")
|
|
201
|
+
print("=" * 60)
|
|
202
|
+
|
|
203
|
+
if total_issues == 0:
|
|
204
|
+
print("[OK] API validation passed")
|
|
205
|
+
sys.exit(0)
|
|
206
|
+
else:
|
|
207
|
+
print("[X] Fix critical issues before deployment")
|
|
208
|
+
sys.exit(1)
|
|
209
|
+
|
|
210
|
+
if __name__ == "__main__":
|
|
211
|
+
main()
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# API 安全测试
|
|
2
|
+
|
|
3
|
+
> API 安全测试原则。OWASP API Top 10、认证与授权测试。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## OWASP API Top 10(安全前十)
|
|
8
|
+
|
|
9
|
+
| 漏洞 | 测试重点 |
|
|
10
|
+
|---------------|------------|
|
|
11
|
+
| **API1: BOLA** | 访问其他用户资源 |
|
|
12
|
+
| **API2: Broken Auth** | JWT、会话、凭证 |
|
|
13
|
+
| **API3: Property Auth** | 批量赋值、数据暴露 |
|
|
14
|
+
| **API4: Resource Consumption** | 速率限制、DoS |
|
|
15
|
+
| **API5: Function Auth** | 管理端点、角色绕过 |
|
|
16
|
+
| **API6: Business Flow** | 逻辑滥用、自动化 |
|
|
17
|
+
| **API7: SSRF** | 内网访问 |
|
|
18
|
+
| **API8: Misconfiguration** | 调试端点、CORS |
|
|
19
|
+
| **API9: Inventory** | 影子 API、旧版本 |
|
|
20
|
+
| **API10: Unsafe Consumption** | 第三方 API 信任 |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 认证测试
|
|
25
|
+
|
|
26
|
+
### JWT 测试
|
|
27
|
+
|
|
28
|
+
| 检查项 | 测试内容 |
|
|
29
|
+
|-------|--------------|
|
|
30
|
+
| 算法 | None、算法混淆 |
|
|
31
|
+
| 密钥 | 弱密钥、暴力破解 |
|
|
32
|
+
| 声明 | 过期、签发者、受众 |
|
|
33
|
+
| 签名 | 篡改、密钥注入 |
|
|
34
|
+
|
|
35
|
+
### 会话测试
|
|
36
|
+
|
|
37
|
+
| 检查项 | 测试内容 |
|
|
38
|
+
|-------|--------------|
|
|
39
|
+
| 生成 | 可预测性 |
|
|
40
|
+
| 存储 | 客户端侧安全 |
|
|
41
|
+
| 过期 | 超时强制 |
|
|
42
|
+
| 失效 | 注销有效性 |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 授权测试
|
|
47
|
+
|
|
48
|
+
| 测试类型 | 方法 |
|
|
49
|
+
|-----------|----------|
|
|
50
|
+
| **水平** | 访问同级用户数据 |
|
|
51
|
+
| **垂直** | 访问更高权限功能 |
|
|
52
|
+
| **上下文** | 访问超出允许范围 |
|
|
53
|
+
|
|
54
|
+
### BOLA/IDOR 测试
|
|
55
|
+
|
|
56
|
+
1. 识别请求中的资源 ID
|
|
57
|
+
2. 以用户 A 会话捕获请求
|
|
58
|
+
3. 以用户 B 会话重放请求
|
|
59
|
+
4. 检查是否存在未授权访问
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 输入验证测试
|
|
64
|
+
|
|
65
|
+
| 注入类型 | 测试重点 |
|
|
66
|
+
|----------------|------------|
|
|
67
|
+
| SQL | 查询篡改 |
|
|
68
|
+
| NoSQL | 文档查询 |
|
|
69
|
+
| 命令 | 系统命令 |
|
|
70
|
+
| LDAP | 目录查询 |
|
|
71
|
+
|
|
72
|
+
**方法:** 测试所有参数,尝试类型强制,测试边界,检查错误信息。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 速率限制测试
|
|
77
|
+
|
|
78
|
+
| 方面 | 检查 |
|
|
79
|
+
|--------|-------|
|
|
80
|
+
| 存在性 | 是否有限制 |
|
|
81
|
+
| 绕过 | 请求头(Header)、IP 轮换 |
|
|
82
|
+
| 范围 | 每用户、每 IP、全局 |
|
|
83
|
+
|
|
84
|
+
**绕过手法:** X-Forwarded-For、不同 HTTP 方法、大小写变体、API 版本。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## GraphQL 安全
|
|
89
|
+
|
|
90
|
+
| 测试 | 重点 |
|
|
91
|
+
|------|-------|
|
|
92
|
+
| 内省 | Schema(模式)泄露 |
|
|
93
|
+
| 批量 | 查询型 DoS |
|
|
94
|
+
| 嵌套 | 深度型 DoS |
|
|
95
|
+
| 授权 | 字段级访问 |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 安全测试检查清单
|
|
100
|
+
|
|
101
|
+
**认证:**
|
|
102
|
+
- [ ] 测试绕过
|
|
103
|
+
- [ ] 检查凭证强度
|
|
104
|
+
- [ ] 验证令牌安全
|
|
105
|
+
|
|
106
|
+
**授权:**
|
|
107
|
+
- [ ] 测试 BOLA/IDOR
|
|
108
|
+
- [ ] 检查权限提升
|
|
109
|
+
- [ ] 验证功能访问
|
|
110
|
+
|
|
111
|
+
**输入:**
|
|
112
|
+
- [ ] 测试所有参数
|
|
113
|
+
- [ ] 检查注入
|
|
114
|
+
|
|
115
|
+
**配置:**
|
|
116
|
+
- [ ] 检查 CORS
|
|
117
|
+
- [ ] 验证请求头(Header)
|
|
118
|
+
- [ ] 测试错误处理
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
> **记住:** API 是现代应用的骨干,像攻击者一样测试它们。
|