@wazir-dev/cli 1.0.0
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/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
# API Security — Comprehensive Expertise Module
|
|
2
|
+
|
|
3
|
+
> **Purpose:** Reference for AI agents during planning and implementation to secure APIs by default.
|
|
4
|
+
> **Last updated:** 2026-03-08
|
|
5
|
+
> **Sources:** OWASP API Security Top 10 2023, real-world breaches 2021-2025, NIST, PCI DSS 4.0
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Threat Landscape
|
|
10
|
+
|
|
11
|
+
### 1.1 Scale
|
|
12
|
+
|
|
13
|
+
APIs are the dominant attack surface. In Q1 2025, 99% of surveyed organizations experienced at
|
|
14
|
+
least one API security issue. BOLA and injection attacks made up over one-third of all incidents.
|
|
15
|
+
India saw a 3,000% increase in API cyberattacks in Q3 2024 (271M+ attacks). Akamai reported
|
|
16
|
+
~26 billion credential stuffing attempts monthly in 2024.
|
|
17
|
+
|
|
18
|
+
### 1.2 OWASP API Security Top 10 2023
|
|
19
|
+
|
|
20
|
+
| # | Risk | Key Concern |
|
|
21
|
+
|---|------|-------------|
|
|
22
|
+
| API1 | Broken Object Level Authorization (BOLA) | Accessing other users' objects by ID manipulation |
|
|
23
|
+
| API2 | Broken Authentication | Weak/missing auth on API endpoints |
|
|
24
|
+
| API3 | Broken Object Property Level Authorization | Excessive data exposure + mass assignment |
|
|
25
|
+
| API4 | Unrestricted Resource Consumption | No rate limiting / resource quotas |
|
|
26
|
+
| API5 | Broken Function Level Authorization | Unauthorized access to admin functions |
|
|
27
|
+
| API6 | Unrestricted Access to Sensitive Business Flows | Automated abuse of business logic |
|
|
28
|
+
| API7 | Server Side Request Forgery (SSRF) | Fetching attacker-controlled URLs from server |
|
|
29
|
+
| API8 | Security Misconfiguration | Missing hardening, verbose errors, open CORS |
|
|
30
|
+
| API9 | Improper Inventory Management | Shadow/zombie APIs, undocumented endpoints |
|
|
31
|
+
| API10 | Unsafe Consumption of APIs | Trusting third-party API responses without validation |
|
|
32
|
+
|
|
33
|
+
### 1.3 Real-World Breaches
|
|
34
|
+
|
|
35
|
+
**Optus (Sep 2022) — Unauthenticated API, 10M records.** Endpoint `api.www.optus.com.au`
|
|
36
|
+
was publicly accessible since 2019 due to a coding error. Customer IDs were sequential
|
|
37
|
+
(predictable IDOR). No rate limiting. Attackers scraped names, DOBs, passport and license
|
|
38
|
+
numbers. Root causes: no auth, predictable IDs, no rate limiting.
|
|
39
|
+
*(Source: ACMA filings, Salt Security)*
|
|
40
|
+
|
|
41
|
+
**Peloton (May 2021) — BOLA, 3M users exposed.** API allowed unauthenticated requests for
|
|
42
|
+
user data regardless of privacy settings. Initial fix only required authentication but still let any
|
|
43
|
+
user access any other user's data — trading API2 (Broken Auth) for API1 (BOLA).
|
|
44
|
+
*(Source: Pen Test Partners, TechCrunch)*
|
|
45
|
+
|
|
46
|
+
**T-Mobile (Jan 2023) — API abuse, 37M records.** Attackers exploited a vulnerable API for 6
|
|
47
|
+
weeks (Nov 2022 - Jan 2023), extracting names, billing addresses, emails, phone numbers, DOBs,
|
|
48
|
+
and account numbers. Root causes: insufficient monitoring, weak access controls.
|
|
49
|
+
*(Source: Krebs on Security, BleepingComputer)*
|
|
50
|
+
|
|
51
|
+
**Dell (May 2024) — Partner portal API, 49M records.** Attackers registered fake partner
|
|
52
|
+
accounts (approved in 24-48h without verification), then scraped by generating service tags at
|
|
53
|
+
5,000 req/min for 3 weeks. No rate limiting, no per-tag authorization.
|
|
54
|
+
*(Source: BleepingComputer, Salt Security)*
|
|
55
|
+
|
|
56
|
+
**DeepSeek (Jan 2025) — Open database via API.** ClickHouse database publicly accessible
|
|
57
|
+
without authentication. Over 1M log entries exposed including chat histories, API keys, backend
|
|
58
|
+
details. Anyone could execute SQL queries directly.
|
|
59
|
+
*(Source: Wiz Research)*
|
|
60
|
+
|
|
61
|
+
### 1.4 Attack Trends
|
|
62
|
+
|
|
63
|
+
- BOLA remains #1 since 2019, appearing in ~40% of all API attacks
|
|
64
|
+
- Automated API abuse (scraping, credential stuffing) is the fastest-growing vector
|
|
65
|
+
- Shadow/zombie APIs are a blind spot — organizations average 3x more APIs than inventoried
|
|
66
|
+
- Supply chain attacks through third-party API consumption are emerging
|
|
67
|
+
- AI-powered attack tools are lowering the barrier for API exploitation
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 2. Core Security Principles
|
|
72
|
+
|
|
73
|
+
### 2.1 Authentication
|
|
74
|
+
|
|
75
|
+
| Method | Use Case | Key Risk |
|
|
76
|
+
|--------|----------|----------|
|
|
77
|
+
| API Keys | Service-to-service identification | Not true auth — identifies, doesn't authenticate. Easily leaked |
|
|
78
|
+
| OAuth 2.0 + OIDC | User-facing apps, delegated access | Complex to implement correctly |
|
|
79
|
+
| JWT (Bearer) | Stateless API auth | Algorithm confusion attacks (CVE-2024-54150). Must pin algorithm |
|
|
80
|
+
| mTLS | Service mesh, zero-trust internal | Certificate management overhead |
|
|
81
|
+
|
|
82
|
+
**Rule:** API keys are NOT authentication. Always combine with OAuth/JWT for sensitive operations.
|
|
83
|
+
|
|
84
|
+
### 2.2 Authorization at Every Endpoint
|
|
85
|
+
|
|
86
|
+
- Implement checks at object level, not just endpoint level (prevents BOLA)
|
|
87
|
+
- Never rely on client-supplied object IDs without verifying ownership
|
|
88
|
+
- Use RBAC/ABAC consistently; authorization logic must live server-side
|
|
89
|
+
|
|
90
|
+
### 2.3 Input Validation
|
|
91
|
+
|
|
92
|
+
- Validate all input against strict schemas (type, length, format, range)
|
|
93
|
+
- Allowlists over denylists; validate Content-Type headers; reject unexpected fields
|
|
94
|
+
|
|
95
|
+
### 2.4 Rate Limiting
|
|
96
|
+
|
|
97
|
+
- Per user/key, per IP, and per endpoint; stricter for auth endpoints
|
|
98
|
+
- Return `429` with `Retry-After` header; graduated response: warn, throttle, block, alert
|
|
99
|
+
|
|
100
|
+
### 2.5 Response Filtering
|
|
101
|
+
|
|
102
|
+
- Never return more data than needed; explicit response schemas with allowlisted fields
|
|
103
|
+
- Strip internal IDs, debug info, stack traces from production responses
|
|
104
|
+
|
|
105
|
+
### 2.6 API Versioning Security
|
|
106
|
+
|
|
107
|
+
- Deprecate old versions on clear timelines; max 2 active versions
|
|
108
|
+
- Old versions often lack security fixes — enforce migration
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 3. Implementation Patterns
|
|
113
|
+
|
|
114
|
+
### 3.1 JWT Validation Middleware (TypeScript)
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// VULNERABLE: No algorithm enforcement, no signature verification
|
|
118
|
+
const decoded = jwt.decode(token); // DANGEROUS: decode without verify
|
|
119
|
+
req.user = decoded;
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// SECURE: Full JWT validation with algorithm pinning
|
|
124
|
+
import jwt, { JwtPayload } from 'jsonwebtoken';
|
|
125
|
+
|
|
126
|
+
export function jwtAuthMiddleware(req: Request, res: Response, next: NextFunction) {
|
|
127
|
+
const authHeader = req.headers.authorization;
|
|
128
|
+
if (!authHeader?.startsWith('Bearer ')) {
|
|
129
|
+
return res.status(401).json({ error: 'Missing Authorization header' });
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const decoded = jwt.verify(authHeader.slice(7), publicKey, {
|
|
133
|
+
algorithms: ['RS256'], // Pin algorithm — prevents confusion attacks
|
|
134
|
+
issuer: 'https://auth.example.com',
|
|
135
|
+
audience: 'https://api.example.com',
|
|
136
|
+
clockTolerance: 30,
|
|
137
|
+
complete: true,
|
|
138
|
+
}) as { payload: JwtPayload };
|
|
139
|
+
if (!decoded.payload.sub) return res.status(401).json({ error: 'Missing subject' });
|
|
140
|
+
req.user = {
|
|
141
|
+
id: decoded.payload.sub,
|
|
142
|
+
scopes: decoded.payload.scope?.split(' ') ?? [],
|
|
143
|
+
};
|
|
144
|
+
next();
|
|
145
|
+
} catch (err) {
|
|
146
|
+
const msg = err instanceof jwt.TokenExpiredError ? 'Token expired' : 'Invalid token';
|
|
147
|
+
return res.status(401).json({ error: msg });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 3.2 OAuth 2.0 Scope Enforcement
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
function requireScopes(...required: string[]) {
|
|
156
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
157
|
+
const has = req.user?.scopes ?? [];
|
|
158
|
+
if (!required.every(s => has.includes(s))) {
|
|
159
|
+
return res.status(403).json({ error: 'Insufficient scope', required });
|
|
160
|
+
}
|
|
161
|
+
next();
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
router.delete('/users/:id', requireScopes('users:delete', 'admin'), deleteUser);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 3.3 Rate Limiting (Token Bucket with Redis)
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import rateLimit from 'express-rate-limit';
|
|
171
|
+
import RedisStore from 'rate-limit-redis';
|
|
172
|
+
|
|
173
|
+
// Strict limit for auth endpoints
|
|
174
|
+
const authLimiter = rateLimit({
|
|
175
|
+
store: new RedisStore({ sendCommand: (...args) => redis.call(...args) }),
|
|
176
|
+
windowMs: 15 * 60 * 1000, max: 10, // 10 attempts per 15 min
|
|
177
|
+
standardHeaders: true, legacyHeaders: false,
|
|
178
|
+
keyGenerator: (req) => req.ip ?? 'unknown',
|
|
179
|
+
});
|
|
180
|
+
// Standard limit for data endpoints
|
|
181
|
+
const apiLimiter = rateLimit({
|
|
182
|
+
store: new RedisStore({ sendCommand: (...args) => redis.call(...args) }),
|
|
183
|
+
windowMs: 60 * 1000, max: 100, // 100 req/min per user
|
|
184
|
+
keyGenerator: (req) => req.user?.id ?? req.ip ?? 'unknown',
|
|
185
|
+
});
|
|
186
|
+
app.use('/api/auth/', authLimiter);
|
|
187
|
+
app.use('/api/', apiLimiter);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 3.4 Input Validation with Zod (Mass Assignment Prevention)
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// VULNERABLE: Passes raw body to ORM — mass assignment
|
|
194
|
+
app.post('/api/users', (req, res) => { db.users.create(req.body); });
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
// SECURE: Strict schema validation
|
|
199
|
+
import { z } from 'zod';
|
|
200
|
+
const CreateUserSchema = z.object({
|
|
201
|
+
email: z.string().email().max(254),
|
|
202
|
+
name: z.string().min(1).max(100),
|
|
203
|
+
password: z.string().min(12).max(128),
|
|
204
|
+
}).strict(); // Rejects unexpected fields — prevents mass assignment
|
|
205
|
+
|
|
206
|
+
app.post('/api/users', validateBody(CreateUserSchema), async (req, res) => {
|
|
207
|
+
const user = await db.users.create({
|
|
208
|
+
...req.validatedBody,
|
|
209
|
+
role: 'user', // Server-controlled, never from input
|
|
210
|
+
isAdmin: false, // Server-controlled, never from input
|
|
211
|
+
});
|
|
212
|
+
res.status(201).json(toPublicUser(user));
|
|
213
|
+
});
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 3.5 BOLA Prevention
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// VULNERABLE: Any authenticated user can see any order
|
|
220
|
+
app.get('/api/orders/:id', async (req, res) => {
|
|
221
|
+
const order = await db.orders.findById(req.params.id);
|
|
222
|
+
res.json(order);
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// SECURE: Ownership enforced at query level
|
|
228
|
+
app.get('/api/orders/:id', async (req, res) => {
|
|
229
|
+
const order = await db.orders.findOne({
|
|
230
|
+
_id: req.params.id,
|
|
231
|
+
userId: req.user.id, // Ownership check in query
|
|
232
|
+
});
|
|
233
|
+
if (!order) return res.status(404).json({ error: 'Not found' }); // 404, not 403
|
|
234
|
+
res.json(filterOrderResponse(order));
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 3.6 GraphQL Security
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
import { createYoga } from 'graphql-yoga';
|
|
242
|
+
import { useDepthLimit } from '@envelop/depth-limit';
|
|
243
|
+
import { costLimitPlugin } from '@escape.tech/graphql-armor-cost-limit';
|
|
244
|
+
import { maxAliasesPlugin } from '@escape.tech/graphql-armor-max-aliases';
|
|
245
|
+
|
|
246
|
+
const yoga = createYoga({
|
|
247
|
+
schema,
|
|
248
|
+
plugins: [
|
|
249
|
+
useDepthLimit({ maxDepth: 7 }), // Prevent deep nesting attacks
|
|
250
|
+
costLimitPlugin({ maxCost: 5000 }), // Query complexity limit
|
|
251
|
+
maxAliasesPlugin({ n: 15 }), // Prevent alias-based DoS
|
|
252
|
+
],
|
|
253
|
+
});
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
GraphQL-specific threats: query depth attacks, batch query abuse, introspection in production
|
|
257
|
+
(disable `__schema`/`__type`), field suggestion leakage, alias-based rate limit bypass.
|
|
258
|
+
|
|
259
|
+
### 3.7 API Gateway Pattern
|
|
260
|
+
|
|
261
|
+
| Concern | Gateway Enforcement |
|
|
262
|
+
|---------|-------------------|
|
|
263
|
+
| Authentication | Validate JWT/OAuth before request reaches backend |
|
|
264
|
+
| Rate limiting | Token bucket per API key/IP |
|
|
265
|
+
| Request validation | Validate against OpenAPI schema |
|
|
266
|
+
| TLS termination | TLS at gateway, mTLS to backends |
|
|
267
|
+
| Logging | Centralized audit trail |
|
|
268
|
+
|
|
269
|
+
Key gateways: **Kong** (plugin-based), **AWS API Gateway** (Lambda authorizers),
|
|
270
|
+
**Envoy** (service mesh), **Nginx** (reverse proxy + `limit_req`).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 4. Vulnerability Catalog — OWASP API Top 10 2023 with CWE
|
|
275
|
+
|
|
276
|
+
| # | Vulnerability | CWE | Fix |
|
|
277
|
+
|---|---------------|-----|-----|
|
|
278
|
+
| API1 | BOLA | CWE-285, CWE-639 | Ownership checks at query level; UUIDs over sequential IDs; return 404 not 403 |
|
|
279
|
+
| API2 | Broken Authentication | CWE-287, CWE-306 | OAuth 2.0/OIDC; MFA for sensitive ops; pin JWT algorithms |
|
|
280
|
+
| API3 | Broken Object Property Level Auth | CWE-213, CWE-915 | Explicit response schemas; `.strict()` validation; never pass raw body to ORM |
|
|
281
|
+
| API4 | Unrestricted Resource Consumption | CWE-770, CWE-400, CWE-799 | Rate limiting per user/IP; size limits; pagination caps; timeouts |
|
|
282
|
+
| API5 | Broken Function Level Auth | CWE-285 | Deny by default; RBAC/ABAC at every function; separate admin/user paths |
|
|
283
|
+
| API6 | Unrestricted Sensitive Business Flows | CWE-799 | CAPTCHA; device fingerprinting; anomaly detection; per-action rate limits |
|
|
284
|
+
| API7 | SSRF | CWE-918 | URL allowlists; block RFC 1918 ranges; disable redirects; DNS rebinding protection |
|
|
285
|
+
| API8 | Security Misconfiguration | CWE-2, CWE-16, CWE-209, CWE-942 | Harden defaults; no DEBUG; restrict CORS; enforce HTTPS; remove unused endpoints |
|
|
286
|
+
| API9 | Improper Inventory Management | CWE-1059 | API inventory; auto-discover via traffic; deprecate old versions; gateway visibility |
|
|
287
|
+
| API10 | Unsafe Consumption of APIs | CWE-20, CWE-918 | Validate third-party responses; timeouts; circuit breakers; same input validation rules |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 5. Security Checklist (28 items)
|
|
292
|
+
|
|
293
|
+
### Authentication & Authorization
|
|
294
|
+
- [ ] All endpoints require authentication (no unauthenticated data access)
|
|
295
|
+
- [ ] JWT algorithm pinned server-side (RS256/ES256) — never trust `alg` from header
|
|
296
|
+
- [ ] JWT claims validated: `iss`, `aud`, `exp`, `nbf`, `sub`
|
|
297
|
+
- [ ] OAuth scopes enforced at each endpoint
|
|
298
|
+
- [ ] Object-level authorization on every data access (BOLA prevention)
|
|
299
|
+
- [ ] Function-level auth separates user and admin paths
|
|
300
|
+
- [ ] API keys hashed in storage, shown once at creation, rotatable
|
|
301
|
+
|
|
302
|
+
### Input & Output
|
|
303
|
+
- [ ] All requests validated against strict schemas (Zod/Joi/Pydantic)
|
|
304
|
+
- [ ] `.strict()` / `extra="forbid"` rejects unexpected fields (mass assignment prevention)
|
|
305
|
+
- [ ] Response schemas allowlist returned fields — no ORM leaking
|
|
306
|
+
- [ ] Content-Type validated; file uploads checked for type, size, and content
|
|
307
|
+
- [ ] Query params validated for type, range, injection patterns
|
|
308
|
+
|
|
309
|
+
### Rate Limiting & Abuse
|
|
310
|
+
- [ ] Rate limiting per user/key AND per IP
|
|
311
|
+
- [ ] Auth endpoints: stricter limits (10-20 attempts/15 min)
|
|
312
|
+
- [ ] Rate limit headers: `RateLimit-Limit`, `RateLimit-Remaining`, `Retry-After`
|
|
313
|
+
- [ ] Pagination enforced (max 100 items/page); max pagination depth
|
|
314
|
+
- [ ] Request body size limits (e.g., 1MB max)
|
|
315
|
+
- [ ] GraphQL: depth, complexity, alias, and token limits
|
|
316
|
+
|
|
317
|
+
### Infrastructure
|
|
318
|
+
- [ ] HTTPS enforced; HSTS header set
|
|
319
|
+
- [ ] CORS restricted to specific origins (never `*` for authenticated APIs)
|
|
320
|
+
- [ ] Errors never leak stack traces, SQL, or internal paths
|
|
321
|
+
- [ ] Unused HTTP methods disabled
|
|
322
|
+
- [ ] Security headers: `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`
|
|
323
|
+
- [ ] API inventory maintained; all endpoints documented and monitored
|
|
324
|
+
- [ ] Old API versions deprecated with sunset dates
|
|
325
|
+
|
|
326
|
+
### Monitoring
|
|
327
|
+
- [ ] Access logs: timestamp, user ID, endpoint, status, IP, user-agent
|
|
328
|
+
- [ ] Anomaly detection for rate spikes, geo shifts, auth failures
|
|
329
|
+
- [ ] Alerting on repeated 401/403 from same source
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 6. Tools & Automation
|
|
334
|
+
|
|
335
|
+
### Security Scanners
|
|
336
|
+
|
|
337
|
+
| Tool | Type | Strength |
|
|
338
|
+
|------|------|----------|
|
|
339
|
+
| **42Crunch** | SAST+DAST | 300+ checks on OpenAPI contracts; low false positives; CI/CD |
|
|
340
|
+
| **StackHawk** | DAST | Developer-friendly; CI native; REST + GraphQL OWASP coverage |
|
|
341
|
+
| **Snyk API** | SAST+DAST | Integrated API+web DAST; fits existing Snyk workflows |
|
|
342
|
+
| **Akto** | Inventory+Testing | Auto-discovers APIs from traffic; tests BOLA, auth issues |
|
|
343
|
+
| **APIsec** | Automated pentest | AI-driven test generation from OpenAPI specs |
|
|
344
|
+
|
|
345
|
+
### API Gateways
|
|
346
|
+
|
|
347
|
+
| Gateway | Key Security Features |
|
|
348
|
+
|---------|----------------------|
|
|
349
|
+
| **Kong** | Plugin ecosystem: rate-limit, key-auth, jwt, cors, bot-detection |
|
|
350
|
+
| **AWS API Gateway** | IAM auth, Cognito, Lambda authorizers; per-key throttling; WAF |
|
|
351
|
+
| **Envoy** | mTLS, external auth filters, rate limiting service (Istio mesh) |
|
|
352
|
+
| **Nginx** | `limit_req_zone` rate limiting, IP filtering, request size limits |
|
|
353
|
+
|
|
354
|
+
### Rate Limiting Libraries
|
|
355
|
+
|
|
356
|
+
| Library | Platform | Notes |
|
|
357
|
+
|---------|----------|-------|
|
|
358
|
+
| `express-rate-limit` | Node.js | Fixed/sliding window with Redis stores |
|
|
359
|
+
| `slowapi` | FastAPI | Sliding window, decorator-based |
|
|
360
|
+
| `bucket4j` | Spring Boot | Token bucket, distributed stores |
|
|
361
|
+
| Nginx `limit_req` | Infrastructure | Leaky bucket at proxy level |
|
|
362
|
+
|
|
363
|
+
### Static Analysis
|
|
364
|
+
|
|
365
|
+
Semgrep rulesets for API security: `p/jwt` (JWT misuse), `p/owasp-top-ten`, `p/nodejs`
|
|
366
|
+
(Express patterns). Custom rules for BOLA, mass assignment, missing auth middleware.
|
|
367
|
+
|
|
368
|
+
### OpenAPI Validation
|
|
369
|
+
|
|
370
|
+
**42Crunch Audit**, **Spectral** (Stoplight), **vacuum** (daveshanley) — lint OpenAPI specs
|
|
371
|
+
for missing security schemes, incomplete schemas, and security misconfigurations.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## 7. Platform-Specific Guidance
|
|
376
|
+
|
|
377
|
+
### REST — Express.js Hardening
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
import helmet from 'helmet';
|
|
381
|
+
import cors from 'cors';
|
|
382
|
+
app.use(helmet());
|
|
383
|
+
app.use(cors({
|
|
384
|
+
origin: ['https://app.example.com'], // Explicit origins, never '*'
|
|
385
|
+
credentials: true,
|
|
386
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
387
|
+
}));
|
|
388
|
+
app.use(express.json({ limit: '1mb' }));
|
|
389
|
+
app.disable('x-powered-by');
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### REST — FastAPI Hardening
|
|
393
|
+
|
|
394
|
+
```python
|
|
395
|
+
from fastapi import FastAPI
|
|
396
|
+
from pydantic import BaseModel, Field
|
|
397
|
+
from slowapi import Limiter
|
|
398
|
+
|
|
399
|
+
app = FastAPI(docs_url=None, redoc_url=None) # Disable docs in production
|
|
400
|
+
limiter = Limiter(key_func=get_remote_address)
|
|
401
|
+
|
|
402
|
+
class UserCreate(BaseModel):
|
|
403
|
+
email: EmailStr
|
|
404
|
+
name: str = Field(..., min_length=1, max_length=100)
|
|
405
|
+
class Config:
|
|
406
|
+
extra = "forbid" # Mass assignment prevention
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### REST — Spring Boot Hardening
|
|
410
|
+
|
|
411
|
+
```java
|
|
412
|
+
http.authorizeHttpRequests(auth -> auth
|
|
413
|
+
.requestMatchers("/api/admin/**").hasRole("ADMIN")
|
|
414
|
+
.requestMatchers("/api/**").authenticated()
|
|
415
|
+
.anyRequest().denyAll() // Deny by default
|
|
416
|
+
).oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt
|
|
417
|
+
.decoder(jwtDecoder()) // Pinned algorithm decoder
|
|
418
|
+
));
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### GraphQL Security Checklist
|
|
422
|
+
|
|
423
|
+
- Disable introspection in production
|
|
424
|
+
- Use persisted/allowlisted queries (Apollo APQ)
|
|
425
|
+
- Field-level auth via directives or resolver checks
|
|
426
|
+
- Limit batch operations (max 5-10 per request)
|
|
427
|
+
- Cost analysis with per-field weights
|
|
428
|
+
|
|
429
|
+
### gRPC Security
|
|
430
|
+
|
|
431
|
+
- Always use TLS; mTLS for service-to-service
|
|
432
|
+
- Auth/authz via server interceptors (not per-handler)
|
|
433
|
+
- Set `maxRecvMsgSize`/`maxSendMsgSize` limits
|
|
434
|
+
- Disable server reflection in production
|
|
435
|
+
- Use short-lived certificates (90 days), automate rotation
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 8. Incident Patterns
|
|
440
|
+
|
|
441
|
+
### 8.1 API Abuse Detection Signals
|
|
442
|
+
|
|
443
|
+
- Request rate >10x baseline from single key/IP
|
|
444
|
+
- Sequential ID enumeration (`/users/1001`, `/users/1002`, ...)
|
|
445
|
+
- Geographic impossibility (same user, two continents, minutes apart)
|
|
446
|
+
- High 4xx error ratio from single source (>50% with 20+ requests)
|
|
447
|
+
- Requests to deprecated/undocumented endpoints
|
|
448
|
+
- Off-hours access patterns for business APIs
|
|
449
|
+
|
|
450
|
+
### 8.2 Credential Stuffing via APIs
|
|
451
|
+
|
|
452
|
+
~26 billion attempts/month in 2024 (Akamai). Detection: high volume of failed logins from
|
|
453
|
+
distributed IPs, sub-100ms inter-request timing (bot), uniform patterns, alphabetical usernames.
|
|
454
|
+
|
|
455
|
+
**Prevention stack:** (1) Rate limit auth endpoints aggressively, (2) MFA on all accounts,
|
|
456
|
+
(3) CAPTCHA after 3 failures, (4) Check passwords against breach DBs (HaveIBeenPwned,
|
|
457
|
+
k-anonymity), (5) Device fingerprinting, (6) Temporary account lockout with notification.
|
|
458
|
+
|
|
459
|
+
### 8.3 Data Exfiltration via APIs
|
|
460
|
+
|
|
461
|
+
Patterns: slow low-volume scraping under rate limits, pagination enumeration, compromised API
|
|
462
|
+
keys, abusing export endpoints, maximum-depth GraphQL queries.
|
|
463
|
+
|
|
464
|
+
**Prevention:** Monitor cumulative data volume per key; field-level access control; max
|
|
465
|
+
pagination depth (e.g., page 100 cap); log and alert on bulk download patterns.
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## 9. Compliance & Standards
|
|
470
|
+
|
|
471
|
+
### 9.1 OWASP API Security Top 10 2023
|
|
472
|
+
|
|
473
|
+
Published July 2023. Key changes from 2019: API3 combines Excessive Data Exposure + Mass
|
|
474
|
+
Assignment into BOPLA; API6 (Sensitive Business Flows), API7 (SSRF), API10 (Unsafe API
|
|
475
|
+
Consumption) are new. Compliance: map each endpoint to risks; test during review; automate
|
|
476
|
+
with 42Crunch, StackHawk, or Semgrep.
|
|
477
|
+
|
|
478
|
+
### 9.2 PCI DSS 4.0
|
|
479
|
+
|
|
480
|
+
First version to explicitly mention APIs (released March 2022, mandatory March 2025).
|
|
481
|
+
- **Req 6.2.3:** Secure development and testing for APIs before production
|
|
482
|
+
- **Req 6.3:** Code reviews of APIs before deployment
|
|
483
|
+
- **Req 6.5:** Validate API documentation / OpenAPI schema accuracy
|
|
484
|
+
- **Req 11.6.1:** Change-detection on payment pages and APIs
|
|
485
|
+
|
|
486
|
+
### 9.3 SOC 2
|
|
487
|
+
|
|
488
|
+
| Criteria | API Relevance |
|
|
489
|
+
|----------|---------------|
|
|
490
|
+
| Security | Auth, authz, encryption in transit, rate limiting |
|
|
491
|
+
| Availability | API uptime SLAs, DDoS protection, circuit breakers |
|
|
492
|
+
| Processing Integrity | Input validation, idempotency, error handling |
|
|
493
|
+
| Confidentiality | Response filtering, field-level ACL, data classification |
|
|
494
|
+
| Privacy | PII in responses, data minimization, consent enforcement |
|
|
495
|
+
|
|
496
|
+
Controls: API logs retained 12+ months; key rotation policy enforced; incident response covers
|
|
497
|
+
API breaches; change management includes API schema review; third-party APIs risk-assessed annually.
|
|
498
|
+
|
|
499
|
+
### 9.4 Other Standards
|
|
500
|
+
|
|
501
|
+
- **NIST SP 800-204/204B:** Microservices security, ABAC for APIs
|
|
502
|
+
- **RFC 8725:** JWT Best Current Practices (algorithm pinning, claim validation)
|
|
503
|
+
- **RFC 6749/6750:** OAuth 2.0 framework and bearer token usage
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
## 10. Code Examples — SSRF and Response Filtering
|
|
508
|
+
|
|
509
|
+
### 10.1 SSRF Prevention
|
|
510
|
+
|
|
511
|
+
```typescript
|
|
512
|
+
// VULNERABLE: User-controlled URL fetched server-side
|
|
513
|
+
app.post('/api/preview', async (req, res) => {
|
|
514
|
+
const response = await fetch(req.body.url); // SSRF — can hit internal services
|
|
515
|
+
res.json(await response.json());
|
|
516
|
+
});
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
// SECURE: URL validation blocking internal networks
|
|
521
|
+
import { URL } from 'url';
|
|
522
|
+
import dns from 'dns/promises';
|
|
523
|
+
import ipaddr from 'ipaddr.js';
|
|
524
|
+
|
|
525
|
+
async function validateExternalUrl(input: string): Promise<URL> {
|
|
526
|
+
const url = new URL(input);
|
|
527
|
+
if (url.protocol !== 'https:') throw new Error('HTTPS only');
|
|
528
|
+
if (['metadata.google.internal', '169.254.169.254'].includes(url.hostname)) {
|
|
529
|
+
throw new Error('Blocked host');
|
|
530
|
+
}
|
|
531
|
+
const addrs = await dns.resolve4(url.hostname);
|
|
532
|
+
for (const addr of addrs) {
|
|
533
|
+
const range = ipaddr.parse(addr).range();
|
|
534
|
+
if (['private', 'loopback', 'linkLocal'].includes(range)) {
|
|
535
|
+
throw new Error('Internal network blocked');
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return url;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
app.post('/api/preview', jwtAuthMiddleware, async (req, res) => {
|
|
542
|
+
const url = await validateExternalUrl(req.body.url);
|
|
543
|
+
const resp = await fetch(url.toString(), {
|
|
544
|
+
redirect: 'error', signal: AbortSignal.timeout(5000),
|
|
545
|
+
});
|
|
546
|
+
res.json(await resp.json());
|
|
547
|
+
});
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### 10.2 Response Filtering
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
// VULNERABLE: Returns entire DB object
|
|
554
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
555
|
+
res.json(await db.users.findById(req.params.id));
|
|
556
|
+
// Leaks: passwordHash, resetToken, internalNotes
|
|
557
|
+
});
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
```typescript
|
|
561
|
+
// SECURE: Explicit allowlist
|
|
562
|
+
function toPublicUser(u: DbUser) {
|
|
563
|
+
return { id: u.id, name: u.name, email: u.email, avatarUrl: u.avatarUrl };
|
|
564
|
+
}
|
|
565
|
+
app.get('/api/users/:id', jwtAuthMiddleware, async (req, res) => {
|
|
566
|
+
const user = await db.users.findOne({
|
|
567
|
+
_id: req.params.id, orgId: req.user.tenantId,
|
|
568
|
+
});
|
|
569
|
+
if (!user) return res.status(404).json({ error: 'Not found' });
|
|
570
|
+
res.json(toPublicUser(user));
|
|
571
|
+
});
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## References
|
|
577
|
+
|
|
578
|
+
- OWASP API Security Top 10 2023: https://owasp.org/API-Security/editions/2023/en/0x11-t10/
|
|
579
|
+
- PCI DSS 4.0: https://www.pcisecuritystandards.org/
|
|
580
|
+
- RFC 8725 — JWT Best Current Practices: https://datatracker.ietf.org/doc/html/rfc8725
|
|
581
|
+
- GraphQL Security — OWASP Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html
|
|
582
|
+
- OWASP Credential Stuffing Prevention: https://cheatsheetseries.owasp.org/cheatsheets/Credential_Stuffing_Prevention_Cheat_Sheet.html
|
|
583
|
+
- NIST SP 800-204: https://csrc.nist.gov/pubs/sp/800/204/final
|
|
584
|
+
- gRPC Auth Guide: https://grpc.io/docs/guides/auth/
|
|
585
|
+
- Salt Security Breach Reviews: https://salt.security/blog
|
|
586
|
+
- 42Crunch API Security: https://42crunch.com/
|