@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,562 @@
|
|
|
1
|
+
# Cross-Site Request Forgery (CSRF) — Security Expertise Module
|
|
2
|
+
|
|
3
|
+
> **CWE-352** | OWASP Top 10 2021: A01 Broken Access Control
|
|
4
|
+
> Last updated: 2026-03-08
|
|
5
|
+
> Sources: OWASP CSRF Prevention Cheat Sheet, PortSwigger Web Security Academy,
|
|
6
|
+
> MITRE CWE, MDN Web Security, OWASP ASVS 5.0
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Threat Landscape
|
|
11
|
+
|
|
12
|
+
### 1.1 How CSRF Works
|
|
13
|
+
|
|
14
|
+
CSRF forces an authenticated user's browser to send a forged HTTP request — including
|
|
15
|
+
session cookies — to a vulnerable web application. The attacker tricks the browser into
|
|
16
|
+
making a state-changing request indistinguishable from a legitimate one.
|
|
17
|
+
|
|
18
|
+
**Attack flow:** Victim authenticates and receives a session cookie. Victim visits a
|
|
19
|
+
malicious page. That page submits a hidden form/fetch to the target site. The browser
|
|
20
|
+
attaches the session cookie automatically. The server processes it as legitimate.
|
|
21
|
+
|
|
22
|
+
Unlike XSS, CSRF does not inject code into the target. The attacker never sees the
|
|
23
|
+
response — only the side effect (state change) matters.
|
|
24
|
+
|
|
25
|
+
### 1.2 Real-World CSRF Exploits
|
|
26
|
+
|
|
27
|
+
| Year | Target | Impact |
|
|
28
|
+
|------|--------|--------|
|
|
29
|
+
| 2006 | Netflix | Account takeover — change shipping address, alter login credentials |
|
|
30
|
+
| 2007 | Gmail | Filter injection silently forwarding all email to attacker |
|
|
31
|
+
| 2008 | ING Direct | Unauthorized money transfers from authenticated banking sessions over SSL |
|
|
32
|
+
| 2008 | YouTube | Nearly all user actions exploitable — favorites, messages, flagging |
|
|
33
|
+
| 2012 | Consumer routers | Mass DNS setting changes redirecting to phishing sites |
|
|
34
|
+
| 2019 | WordPress plugins | Admin action exposure via CSRF enabling privilege escalation |
|
|
35
|
+
| 2025 | WordPress plugin (CVE) | CSRF flaw exploited in the wild for unauthorized actions |
|
|
36
|
+
| 2025 | Global retailer | Third-party pixel exfiltrated CSRF and auth tokens to remote servers |
|
|
37
|
+
|
|
38
|
+
### 1.3 CSRF in Financial Applications
|
|
39
|
+
|
|
40
|
+
Financial apps are high-value targets: state changes carry monetary impact (wire
|
|
41
|
+
transfers, beneficiary additions); regulatory exposure (PCI-DSS violations); long-lived
|
|
42
|
+
sessions widen the attack window; multi-step workflows can be chained with social
|
|
43
|
+
engineering when confirmation steps lack independent authentication.
|
|
44
|
+
|
|
45
|
+
### 1.4 Trends: SameSite Cookies and Evolving Risk
|
|
46
|
+
|
|
47
|
+
Browsers now default to `SameSite=Lax` (Chrome since 2020, Firefox/Edge followed),
|
|
48
|
+
significantly reducing POST-based CSRF. However, risk persists:
|
|
49
|
+
|
|
50
|
+
- GET requests with side effects remain exploitable under Lax.
|
|
51
|
+
- Bypass techniques exist: method override, sibling domain attacks, client-side
|
|
52
|
+
redirects, 2-minute cookie refresh window.
|
|
53
|
+
- Legacy apps explicitly setting `SameSite=None` re-enable full CSRF exposure.
|
|
54
|
+
- Mobile WebViews may not enforce SameSite consistently.
|
|
55
|
+
|
|
56
|
+
### 1.5 CSRF in APIs
|
|
57
|
+
|
|
58
|
+
- **Bearer token auth** (Authorization header) is inherently immune — browser does not
|
|
59
|
+
auto-attach the token.
|
|
60
|
+
- **Cookie-authenticated APIs** require explicit CSRF protection.
|
|
61
|
+
- **GraphQL** accepting mutations via GET is especially vulnerable.
|
|
62
|
+
- **WebSocket** handshakes carry cookies without CORS preflight.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 2. Core Security Principles
|
|
67
|
+
|
|
68
|
+
### 2.1 Synchronizer Token Pattern (Stateful)
|
|
69
|
+
|
|
70
|
+
Server generates a CSPRNG token, stores it in the session, embeds it in forms/headers.
|
|
71
|
+
Every state-changing request must include the token; server validates against session.
|
|
72
|
+
|
|
73
|
+
**Strengths:** Strong, well-understood, framework-supported.
|
|
74
|
+
**Weaknesses:** Requires server-side session state.
|
|
75
|
+
|
|
76
|
+
### 2.2 Double-Submit Cookie Pattern (Stateless)
|
|
77
|
+
|
|
78
|
+
Server sets a random value in both a cookie and a request parameter. Server verifies
|
|
79
|
+
they match. Attacker cannot read the cookie cross-origin, so cannot forge the parameter.
|
|
80
|
+
|
|
81
|
+
**Signed variant (recommended):** HMAC-SHA256 with server secret, binding to session ID:
|
|
82
|
+
```
|
|
83
|
+
token = nonce + "." + HMAC-SHA256(secret, session_id + nonce)
|
|
84
|
+
```
|
|
85
|
+
Without session binding, the pattern remains vulnerable to cookie injection attacks.
|
|
86
|
+
|
|
87
|
+
### 2.3 SameSite Cookie Attribute
|
|
88
|
+
|
|
89
|
+
| Value | Behavior | CSRF Protection |
|
|
90
|
+
|-------|----------|-----------------|
|
|
91
|
+
| `Strict` | Never sent cross-site | Strong, but breaks legitimate cross-site nav |
|
|
92
|
+
| `Lax` | Sent on top-level GET only | Good default; blocks POST-based CSRF |
|
|
93
|
+
| `None` | Always sent (requires `Secure`) | No protection |
|
|
94
|
+
|
|
95
|
+
Use `SameSite=Lax` as baseline. Never rely on it as sole defense.
|
|
96
|
+
|
|
97
|
+
### 2.4 Origin/Referer Validation
|
|
98
|
+
|
|
99
|
+
Check `Origin` or `Referer` on incoming requests; reject unexpected origins. Use as
|
|
100
|
+
defense-in-depth only — headers can be stripped by privacy extensions, absent on some
|
|
101
|
+
requests, or missing from older clients.
|
|
102
|
+
|
|
103
|
+
### 2.5 Custom Request Headers
|
|
104
|
+
|
|
105
|
+
Require a custom header (e.g., `X-Requested-With`) on state-changing requests. Cross-
|
|
106
|
+
origin requests with custom headers trigger CORS preflight, which the attacker's domain
|
|
107
|
+
fails. Effective only when CORS is correctly configured.
|
|
108
|
+
|
|
109
|
+
### 2.6 Fetch Metadata Headers
|
|
110
|
+
|
|
111
|
+
Modern browsers send `Sec-Fetch-Site` (`same-origin`/`same-site`/`cross-site`/`none`),
|
|
112
|
+
`Sec-Fetch-Mode`, and `Sec-Fetch-Dest`. Servers can implement a Resource Isolation
|
|
113
|
+
Policy rejecting cross-site state-changing requests. Supported 97%+ of browsers (all
|
|
114
|
+
major browsers since March 2023).
|
|
115
|
+
|
|
116
|
+
### 2.7 Defense-in-Depth Strategy
|
|
117
|
+
|
|
118
|
+
1. **Primary:** CSRF tokens (synchronizer or signed double-submit)
|
|
119
|
+
2. **Secondary:** `SameSite=Lax` or `Strict` cookies
|
|
120
|
+
3. **Tertiary:** Origin/Referer validation, Fetch Metadata checks
|
|
121
|
+
4. **Foundation:** Eliminate XSS — XSS defeats all CSRF defenses
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 3. Implementation Patterns
|
|
126
|
+
|
|
127
|
+
### 3.1 CSRF Token Requirements (OWASP)
|
|
128
|
+
|
|
129
|
+
- At least 128 bits of entropy (32 hex chars), generated by CSPRNG
|
|
130
|
+
- Unique per user session; transmitted via hidden form field or custom header, never URL
|
|
131
|
+
- Validate with constant-time comparison; reject missing tokens (not treat as valid)
|
|
132
|
+
- Regenerate on authentication; invalidate on logout
|
|
133
|
+
|
|
134
|
+
### 3.2 SameSite Cookie Configuration
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Lax; Path=/; Max-Age=3600
|
|
138
|
+
```
|
|
139
|
+
Always pair `SameSite=None` with `Secure`. Audit all cookies for appropriate SameSite.
|
|
140
|
+
|
|
141
|
+
### 3.3 Framework Built-in CSRF Protection
|
|
142
|
+
|
|
143
|
+
**Express.js** — `csurf` deprecated (Sept 2022, security issues). Use `csrf-csrf`:
|
|
144
|
+
```typescript
|
|
145
|
+
import { doubleCsrf } from "csrf-csrf";
|
|
146
|
+
const { doubleCsrfProtection, generateToken } = doubleCsrf({
|
|
147
|
+
getSecret: () => process.env.CSRF_SECRET!,
|
|
148
|
+
cookieName: "__Host-csrf",
|
|
149
|
+
cookieOptions: { httpOnly: true, sameSite: "lax", secure: true, path: "/" },
|
|
150
|
+
getTokenFromRequest: (req) => req.headers["x-csrf-token"] as string,
|
|
151
|
+
});
|
|
152
|
+
app.use(doubleCsrfProtection);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Django** — `CsrfViewMiddleware` enabled by default. Uses double-submit cookie with
|
|
156
|
+
HMAC masking (BREACH-resistant). Configure: `CSRF_COOKIE_SECURE = True`,
|
|
157
|
+
`CSRF_COOKIE_SAMESITE = "Lax"`, `CSRF_TRUSTED_ORIGINS = ["https://app.example.com"]`.
|
|
158
|
+
|
|
159
|
+
**Spring Security** — CSRF enabled by default via `CsrfFilter`. Uses Synchronizer Token
|
|
160
|
+
with `HttpSessionCsrfTokenRepository`. For SPAs, use `CookieCsrfTokenRepository`:
|
|
161
|
+
```java
|
|
162
|
+
http.csrf(csrf -> csrf
|
|
163
|
+
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Rails** — `protect_from_forgery` enabled by default. Synchronizer Token in session.
|
|
167
|
+
**Laravel** — `VerifyCsrfToken` middleware enabled by default. Synchronizer Token.
|
|
168
|
+
|
|
169
|
+
### 3.4 CSRF Protection for SPAs
|
|
170
|
+
|
|
171
|
+
**Cookie-to-Header pattern:** Backend sets non-HttpOnly cookie with CSRF token. SPA
|
|
172
|
+
reads from `document.cookie`, sends as `X-CSRF-Token` header. Backend validates match.
|
|
173
|
+
|
|
174
|
+
**Token endpoint pattern:** SPA calls `GET /api/csrf-token` on init, stores token
|
|
175
|
+
in-memory (not localStorage — XSS-vulnerable), attaches to request headers.
|
|
176
|
+
|
|
177
|
+
**Bearer token auth (CSRF-immune):** If SPA uses JWT/OAuth tokens in the `Authorization`
|
|
178
|
+
header stored in memory (not cookies), CSRF protection is unnecessary.
|
|
179
|
+
|
|
180
|
+
### 3.5 Stateless CSRF (HMAC-Based)
|
|
181
|
+
|
|
182
|
+
For horizontally scaled or serverless architectures:
|
|
183
|
+
```
|
|
184
|
+
token = timestamp + ":" + nonce + ":" + HMAC(secret, timestamp + nonce + session_id)
|
|
185
|
+
```
|
|
186
|
+
Server validates by recomputing HMAC. Timestamp enables expiration without storage.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 4. Vulnerability Catalog
|
|
191
|
+
|
|
192
|
+
### V-CSRF-01: Missing CSRF Token on State-Changing Endpoints
|
|
193
|
+
**CWE-352** | Severity: High
|
|
194
|
+
POST/PUT/DELETE endpoints accepting cookie-authenticated requests without CSRF tokens.
|
|
195
|
+
Fix: Apply CSRF middleware to all state-changing routes.
|
|
196
|
+
|
|
197
|
+
### V-CSRF-02: Token Present but Not Validated Server-Side
|
|
198
|
+
**CWE-352** | Severity: High
|
|
199
|
+
Form includes a token field, but server ignores it. Creates false sense of security.
|
|
200
|
+
Fix: Ensure middleware validates the token and rejects invalid/missing values.
|
|
201
|
+
|
|
202
|
+
### V-CSRF-03: GET Requests with Side Effects
|
|
203
|
+
**CWE-352** | Severity: High
|
|
204
|
+
State-changing GET endpoints bypass `SameSite=Lax` (allows cookies on top-level GET).
|
|
205
|
+
Fix: Use POST/PUT/DELETE for state changes. GET must be safe and idempotent (RFC 7231).
|
|
206
|
+
|
|
207
|
+
### V-CSRF-04: CORS Misconfiguration Enabling CSRF
|
|
208
|
+
**CWE-346, CWE-352** | Severity: Critical
|
|
209
|
+
Reflecting any Origin with credentials or using wildcard + credentials allows cross-
|
|
210
|
+
origin authenticated requests. Fix: Explicit origin allowlist; never reflect blindly.
|
|
211
|
+
|
|
212
|
+
### V-CSRF-05: SameSite=None Without Secure Flag
|
|
213
|
+
**CWE-1275** | Severity: Medium
|
|
214
|
+
Modern browsers reject this, but older browsers silently ignore SameSite entirely.
|
|
215
|
+
Fix: Always pair `SameSite=None` with `Secure`.
|
|
216
|
+
|
|
217
|
+
### V-CSRF-06: Login CSRF
|
|
218
|
+
**CWE-352** | Severity: Medium
|
|
219
|
+
Unprotected login forms let attackers log victims into the attacker's account, capturing
|
|
220
|
+
sensitive data (payment methods, search history). Fix: CSRF-protect login forms.
|
|
221
|
+
|
|
222
|
+
### V-CSRF-07: JSON Content-Type CSRF
|
|
223
|
+
**CWE-352** | Severity: Medium
|
|
224
|
+
JSON APIs may appear immune (HTML forms cannot submit JSON), but `navigator.sendBeacon()`
|
|
225
|
+
or misconfigured CORS can enable cross-origin JSON requests.
|
|
226
|
+
Fix: Validate Content-Type strictly, require custom headers, validate CSRF tokens.
|
|
227
|
+
|
|
228
|
+
### V-CSRF-08: Token Leakage via URL or Referer
|
|
229
|
+
**CWE-598** | Severity: Medium
|
|
230
|
+
Tokens in URL query parameters leak via server logs, browser history, Referer header.
|
|
231
|
+
Fix: Transmit tokens in request bodies or custom headers only.
|
|
232
|
+
|
|
233
|
+
### V-CSRF-09: Subdomain Takeover Enabling CSRF
|
|
234
|
+
**CWE-352** | Severity: High
|
|
235
|
+
Compromised subdomains bypass `SameSite=Lax` (same-site) and can inject cookies for
|
|
236
|
+
double-submit attacks. Fix: Audit DNS for dangling records. Use `__Host-` cookie prefix.
|
|
237
|
+
|
|
238
|
+
### V-CSRF-10: Method Override Bypassing SameSite=Lax
|
|
239
|
+
**CWE-352** | Severity: Medium
|
|
240
|
+
Frameworks supporting `_method` override let GET requests (allowed by Lax) appear as
|
|
241
|
+
POST. Fix: Disable method override in production or validate CSRF on overridden method.
|
|
242
|
+
|
|
243
|
+
### V-CSRF-11: Token Not Bound to Session
|
|
244
|
+
**CWE-352** | Severity: Medium
|
|
245
|
+
Globally valid tokens let attackers reuse tokens from their own session.
|
|
246
|
+
Fix: Bind tokens to session ID via HMAC.
|
|
247
|
+
|
|
248
|
+
### V-CSRF-12: Missing Protection on File Upload Endpoints
|
|
249
|
+
**CWE-352** | Severity: High
|
|
250
|
+
Multipart endpoints excluded from CSRF middleware due to parsing complexity.
|
|
251
|
+
Fix: Ensure CSRF middleware handles multipart; order middleware correctly.
|
|
252
|
+
|
|
253
|
+
### V-CSRF-13: WebSocket Initiation CSRF
|
|
254
|
+
**CWE-352** | Severity: Medium
|
|
255
|
+
WebSocket Upgrade carries cookies without CORS preflight.
|
|
256
|
+
Fix: Validate Origin header during handshake; require CSRF token as first message.
|
|
257
|
+
|
|
258
|
+
### V-CSRF-14: OAuth State Parameter Missing
|
|
259
|
+
**CWE-352** | Severity: High
|
|
260
|
+
Missing `state` in OAuth flow lets attacker link their external account to victim's app.
|
|
261
|
+
Fix: Use cryptographic random `state` bound to session; validate on callback.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 5. Security Checklist
|
|
266
|
+
|
|
267
|
+
### Token Management
|
|
268
|
+
- [ ] **CS-01**: All state-changing endpoints require a valid CSRF token
|
|
269
|
+
- [ ] **CS-02**: Tokens use CSPRNG with at least 128 bits of entropy
|
|
270
|
+
- [ ] **CS-03**: Server validates tokens using constant-time comparison
|
|
271
|
+
- [ ] **CS-04**: Tokens bound to user session (HMAC or session storage)
|
|
272
|
+
- [ ] **CS-05**: Tokens regenerated on auth, invalidated on logout
|
|
273
|
+
- [ ] **CS-06**: Tokens never in URL query parameters
|
|
274
|
+
|
|
275
|
+
### Cookie Configuration
|
|
276
|
+
- [ ] **CS-07**: Session cookies use `SameSite=Lax` or `Strict`
|
|
277
|
+
- [ ] **CS-08**: Any `SameSite=None` cookie also has `Secure`
|
|
278
|
+
- [ ] **CS-09**: Session cookies use `HttpOnly` and `Secure`
|
|
279
|
+
- [ ] **CS-10**: `__Host-` prefix on session cookies
|
|
280
|
+
|
|
281
|
+
### HTTP and Origin
|
|
282
|
+
- [ ] **CS-11**: GET requests are safe and idempotent (no side effects)
|
|
283
|
+
- [ ] **CS-12**: HTTP method override disabled or CSRF-validated
|
|
284
|
+
- [ ] **CS-13**: Origin/Referer validated as defense-in-depth
|
|
285
|
+
- [ ] **CS-14**: CORS uses explicit allowlist (no wildcard + credentials)
|
|
286
|
+
- [ ] **CS-15**: Fetch Metadata (`Sec-Fetch-Site`) checked where supported
|
|
287
|
+
|
|
288
|
+
### Framework and Architecture
|
|
289
|
+
- [ ] **CS-16**: Framework built-in CSRF protection enabled, not bypassed
|
|
290
|
+
- [ ] **CS-17**: Login and logout forms include CSRF protection
|
|
291
|
+
- [ ] **CS-18**: File upload endpoints covered by CSRF middleware
|
|
292
|
+
- [ ] **CS-19**: WebSocket handshakes validate Origin header
|
|
293
|
+
- [ ] **CS-20**: OAuth flows use cryptographic `state` parameter
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## 6. Tools and Automation
|
|
298
|
+
|
|
299
|
+
### 6.1 Testing Tools
|
|
300
|
+
|
|
301
|
+
| Tool | Purpose | Context |
|
|
302
|
+
|------|---------|---------|
|
|
303
|
+
| **Burp Suite Pro** | CSRF PoC generation, automated scanning | Pen testing |
|
|
304
|
+
| **Burp CSRF Token Tracker** | Handle rotating tokens during scanning | Extension |
|
|
305
|
+
| **OWASP ZAP** | Automated CSRF scanning | CI/CD, pen testing |
|
|
306
|
+
| **Postman/Insomnia** | Manual API CSRF testing | Dev/QA |
|
|
307
|
+
|
|
308
|
+
**Burp CSRF PoC workflow:** Capture request in Proxy/Repeater. Right-click, select
|
|
309
|
+
Engagement tools > Generate CSRF PoC. Burp auto-generates HTML that replays the request.
|
|
310
|
+
CSRF Token Tracker extension handles token rotation during Intruder/Scanner runs.
|
|
311
|
+
|
|
312
|
+
### 6.2 Static Analysis — Semgrep
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
rules:
|
|
316
|
+
- id: flask-csrf-disabled
|
|
317
|
+
patterns:
|
|
318
|
+
- pattern: WTF_CSRF_CHECK_DEFAULT = False
|
|
319
|
+
message: "CSRF protection disabled. Set WTF_CSRF_CHECK_DEFAULT to True."
|
|
320
|
+
severity: ERROR
|
|
321
|
+
languages: [python]
|
|
322
|
+
metadata:
|
|
323
|
+
cwe: "CWE-352"
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Semgrep also provides rules for detecting missing CSRF middleware in Express, Django
|
|
327
|
+
`@csrf_exempt` overuse, and Spring Security CSRF disabled configurations.
|
|
328
|
+
|
|
329
|
+
### 6.3 Framework CSRF Middleware Summary
|
|
330
|
+
|
|
331
|
+
| Framework | Built-in | Mechanism | Default |
|
|
332
|
+
|-----------|----------|-----------|---------|
|
|
333
|
+
| Django | Yes | Double-submit + HMAC masking | On |
|
|
334
|
+
| Spring Security | Yes | Synchronizer Token (session) | On |
|
|
335
|
+
| Rails | Yes | Synchronizer Token (session) | On |
|
|
336
|
+
| Laravel | Yes | Synchronizer Token (session) | On |
|
|
337
|
+
| Express.js | No | Use `csrf-csrf` package | N/A |
|
|
338
|
+
| ASP.NET Core | Yes | Synchronizer Token | Opt-in |
|
|
339
|
+
| Flask | Via Flask-WTF | Double-submit cookie | Opt-in |
|
|
340
|
+
| Next.js / FastAPI | No | Custom implementation needed | N/A |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 7. Platform-Specific Guidance
|
|
345
|
+
|
|
346
|
+
### 7.1 Traditional Server-Rendered Apps
|
|
347
|
+
|
|
348
|
+
Use the framework's built-in synchronizer token. Embed via template helpers (Django:
|
|
349
|
+
`{% csrf_token %}`, Rails: `form_authenticity_token`, Laravel: `@csrf`). Validate on
|
|
350
|
+
every POST/PUT/DELETE. Set `SameSite=Lax` on session cookies.
|
|
351
|
+
|
|
352
|
+
### 7.2 Single Page Applications (SPAs)
|
|
353
|
+
|
|
354
|
+
If using cookie-based auth: CSRF protection is mandatory. Use double-submit cookie with
|
|
355
|
+
non-HttpOnly cookie. Store token in-memory, send via custom header. If using bearer
|
|
356
|
+
token auth (JWT in Authorization header, stored in memory): CSRF protection unnecessary.
|
|
357
|
+
If JWTs are stored in cookies, CSRF protection is still required.
|
|
358
|
+
|
|
359
|
+
### 7.3 Mobile App APIs
|
|
360
|
+
|
|
361
|
+
Native HTTP clients are generally CSRF-immune (no automatic cookie attachment, bearer
|
|
362
|
+
token auth). **Exceptions:** APIs shared with web apps using cookie auth; WebViews
|
|
363
|
+
loading web content with cookie sessions; requests from mobile browsers.
|
|
364
|
+
|
|
365
|
+
### 7.4 GraphQL APIs
|
|
366
|
+
|
|
367
|
+
Reject mutations on GET. Require custom header (`X-GraphQL-Request`). Apply standard
|
|
368
|
+
CSRF token validation for cookie-authenticated GraphQL endpoints.
|
|
369
|
+
|
|
370
|
+
### 7.5 Microservices
|
|
371
|
+
|
|
372
|
+
Apply CSRF validation at the API gateway, not individual services. Internal service-to-
|
|
373
|
+
service calls do not need CSRF protection. Gateway validates tokens before forwarding.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## 8. Incident Patterns
|
|
378
|
+
|
|
379
|
+
### 8.1 Detection Signals
|
|
380
|
+
|
|
381
|
+
**WAF/proxy logs:** State-changing requests with missing/mismatched Origin/Referer;
|
|
382
|
+
POST/PUT/DELETE where `Sec-Fetch-Site: cross-site`; requests to sensitive endpoints
|
|
383
|
+
without CSRF token; unusual volume of state changes from one session.
|
|
384
|
+
|
|
385
|
+
**Application logs:** Spike in 403s on state-changing endpoints (token validation
|
|
386
|
+
failures); account changes without corresponding UI clickstream; privileged actions
|
|
387
|
+
immediately after external site visits.
|
|
388
|
+
|
|
389
|
+
**SIEM/XDR:** Cross-reference state changes with user behavior analytics; alert on
|
|
390
|
+
privilege-sensitive operations without multi-step confirmation.
|
|
391
|
+
|
|
392
|
+
### 8.2 Response Steps
|
|
393
|
+
|
|
394
|
+
1. **Contain** — Enforce re-authentication for high-value actions; set `SameSite=Strict`
|
|
395
|
+
as emergency measure.
|
|
396
|
+
2. **Identify** — Review access logs; find sessions with suspicious Referer/Origin.
|
|
397
|
+
3. **Scope** — Determine affected accounts and unauthorized state changes (transfers,
|
|
398
|
+
email changes, privilege escalations).
|
|
399
|
+
4. **Remediate** — Deploy CSRF tokens on affected endpoints; invalidate all sessions for
|
|
400
|
+
affected users; revert unauthorized changes.
|
|
401
|
+
5. **Recover** — Notify users; reset compromised credentials; restore from backups.
|
|
402
|
+
6. **Harden** — Implement full defense-in-depth; add monitoring for token failures.
|
|
403
|
+
7. **Post-mortem** — Document vector, gap, timeline. Update threat model.
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## 9. Compliance and Standards
|
|
408
|
+
|
|
409
|
+
### 9.1 OWASP
|
|
410
|
+
|
|
411
|
+
- **Top 10 (2021):** CSRF under A01 Broken Access Control (#1 position).
|
|
412
|
+
- **ASVS 5.0 (2025):** Section 4.3.3 — CSRF protection verification. L1: basic; L2:
|
|
413
|
+
token validation on all state-changing requests; L3: defense-in-depth.
|
|
414
|
+
- **Prevention Cheat Sheet:** Updated for HMAC tokens and Fetch Metadata headers.
|
|
415
|
+
- **Testing Guide:** WSTG-SESS-05 covers CSRF testing methodology.
|
|
416
|
+
|
|
417
|
+
### 9.2 CWE-352
|
|
418
|
+
|
|
419
|
+
- **CWE-352:** Canonical identifier. Related: CWE-346 (Origin Validation Error),
|
|
420
|
+
CWE-613 (Insufficient Session Expiration), CWE-598 (GET with Sensitive Query Strings),
|
|
421
|
+
CWE-1275 (Improper SameSite Attribute).
|
|
422
|
+
- **CAPEC:** CAPEC-62 (CSRF), CAPEC-111 (JSON Hijacking), CAPEC-462 (Cross-Domain
|
|
423
|
+
Search Timing).
|
|
424
|
+
|
|
425
|
+
### 9.3 PCI-DSS
|
|
426
|
+
|
|
427
|
+
- **Requirement 6.2.4:** Protection against CSRF for apps processing cardholder data.
|
|
428
|
+
- **Requirement 6.4:** WAF must detect/block CSRF for public-facing web apps.
|
|
429
|
+
- ASVS L2 compliance covers substantial PCI-DSS Requirement 6 web app requirements.
|
|
430
|
+
|
|
431
|
+
### 9.4 NIST and ISO
|
|
432
|
+
|
|
433
|
+
- **NIST SP 800-53 Rev. 5:** SC-23 (Session Authenticity) covers CSRF.
|
|
434
|
+
- **ISO 27001:2022:** Annex A.8.26 (Application Security Requirements).
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## 10. Code Examples
|
|
439
|
+
|
|
440
|
+
### 10.1 CSRF Token Middleware (TypeScript / Express)
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
import crypto from "node:crypto";
|
|
444
|
+
import type { Request, Response, NextFunction } from "express";
|
|
445
|
+
|
|
446
|
+
const SECRET = process.env.CSRF_SECRET!;
|
|
447
|
+
const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS", "TRACE"]);
|
|
448
|
+
|
|
449
|
+
function generateToken(sessionId: string): string {
|
|
450
|
+
const nonce = crypto.randomBytes(16).toString("hex");
|
|
451
|
+
const ts = Date.now().toString(36);
|
|
452
|
+
const payload = `${ts}.${nonce}`;
|
|
453
|
+
const sig = crypto.createHmac("sha256", SECRET)
|
|
454
|
+
.update(`${sessionId}:${payload}`).digest("hex");
|
|
455
|
+
return `${payload}.${sig}`;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
function validateToken(token: string, sessionId: string): boolean {
|
|
459
|
+
const parts = token.split(".");
|
|
460
|
+
if (parts.length !== 3) return false;
|
|
461
|
+
const [ts, nonce, sig] = parts;
|
|
462
|
+
const expected = crypto.createHmac("sha256", SECRET)
|
|
463
|
+
.update(`${sessionId}:${ts}.${nonce}`).digest("hex");
|
|
464
|
+
if (sig.length !== expected.length) return false;
|
|
465
|
+
return crypto.timingSafeEqual(Buffer.from(sig, "hex"), Buffer.from(expected, "hex"));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export function csrfProtection(req: Request, res: Response, next: NextFunction): void {
|
|
469
|
+
const sid = req.session?.id;
|
|
470
|
+
if (!sid) { res.status(403).json({ error: "No session" }); return; }
|
|
471
|
+
|
|
472
|
+
if (SAFE_METHODS.has(req.method)) {
|
|
473
|
+
const token = generateToken(sid);
|
|
474
|
+
res.cookie("__Host-csrf", token, {
|
|
475
|
+
httpOnly: false, secure: true, sameSite: "lax", path: "/", maxAge: 3600_000,
|
|
476
|
+
});
|
|
477
|
+
res.setHeader("X-CSRF-Token", token);
|
|
478
|
+
return next();
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
const headerToken = req.headers["x-csrf-token"] as string | undefined;
|
|
482
|
+
if (!headerToken) { res.status(403).json({ error: "CSRF token missing" }); return; }
|
|
483
|
+
if (!validateToken(headerToken, sid)) {
|
|
484
|
+
res.status(403).json({ error: "CSRF token invalid" }); return;
|
|
485
|
+
}
|
|
486
|
+
next();
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### 10.2 SPA CSRF Client (TypeScript)
|
|
491
|
+
|
|
492
|
+
```typescript
|
|
493
|
+
let csrfToken: string | null = null;
|
|
494
|
+
|
|
495
|
+
export async function initCsrf(): Promise<void> {
|
|
496
|
+
const res = await fetch("/api/csrf-token", { credentials: "include" });
|
|
497
|
+
csrfToken = (await res.json()).token;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
export async function secureFetch(url: string, opts: RequestInit = {}): Promise<Response> {
|
|
501
|
+
const method = (opts.method ?? "GET").toUpperCase();
|
|
502
|
+
const headers = new Headers(opts.headers);
|
|
503
|
+
if (!["GET", "HEAD", "OPTIONS"].includes(method) && csrfToken) {
|
|
504
|
+
headers.set("X-CSRF-Token", csrfToken);
|
|
505
|
+
}
|
|
506
|
+
return fetch(url, { ...opts, headers, credentials: "include" });
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### 10.3 Fetch Metadata Resource Isolation (TypeScript / Express)
|
|
511
|
+
|
|
512
|
+
```typescript
|
|
513
|
+
export function fetchMetadataPolicy(req: Request, res: Response, next: NextFunction) {
|
|
514
|
+
const site = req.headers["sec-fetch-site"] as string | undefined;
|
|
515
|
+
if (!site) return next(); // Browser doesn't send Fetch Metadata
|
|
516
|
+
if (["same-origin", "same-site", "none"].includes(site)) return next();
|
|
517
|
+
if (site === "cross-site" && req.headers["sec-fetch-mode"] === "navigate"
|
|
518
|
+
&& req.method === "GET") return next();
|
|
519
|
+
res.status(403).json({ error: "Cross-site request blocked" });
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### 10.4 Vulnerable vs. Secure Comparison
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
// --- VULNERABLE ---
|
|
527
|
+
app.use(cors({ origin: true, credentials: true })); // Reflects any origin
|
|
528
|
+
app.post("/api/transfer", (req, res) => { // No CSRF check
|
|
529
|
+
processTransfer(req.session!.userId, req.body.to, req.body.amount);
|
|
530
|
+
res.json({ success: true });
|
|
531
|
+
});
|
|
532
|
+
// No SameSite on cookies, no Origin validation, no Fetch Metadata check
|
|
533
|
+
|
|
534
|
+
// --- SECURE ---
|
|
535
|
+
app.use(cors({ origin: ["https://app.example.com"], credentials: true }));
|
|
536
|
+
app.use(session({ cookie: { secure: true, httpOnly: true, sameSite: "lax" } }));
|
|
537
|
+
app.use(fetchMetadataPolicy);
|
|
538
|
+
app.use(csrfProtection);
|
|
539
|
+
app.post("/api/transfer", (req, res) => {
|
|
540
|
+
// CSRF validated by middleware chain before reaching handler
|
|
541
|
+
processTransfer(req.session!.userId, req.body.to, req.body.amount);
|
|
542
|
+
res.json({ success: true });
|
|
543
|
+
});
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## References
|
|
549
|
+
|
|
550
|
+
- [OWASP CSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html)
|
|
551
|
+
- [OWASP CSRF Attack Description](https://owasp.org/www-community/attacks/csrf)
|
|
552
|
+
- [PortSwigger — CSRF](https://portswigger.net/web-security/csrf)
|
|
553
|
+
- [PortSwigger — Bypassing SameSite Restrictions](https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions)
|
|
554
|
+
- [MDN Web Security — CSRF](https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/CSRF)
|
|
555
|
+
- [CWE-352](https://cwe.mitre.org/data/definitions/352.html)
|
|
556
|
+
- [web.dev — Fetch Metadata](https://web.dev/articles/fetch-metadata)
|
|
557
|
+
- [csrf-csrf npm package](https://www.npmjs.com/package/csrf-csrf)
|
|
558
|
+
- [Django CSRF docs](https://docs.djangoproject.com/en/5.2/howto/csrf/)
|
|
559
|
+
- [Spring Security CSRF docs](https://docs.spring.io/spring-security/reference/features/exploits/csrf.html)
|
|
560
|
+
- [The Hacker News — CSRF Case Study: Global Retailer (2025)](https://thehackernews.com/2025/04/new-case-study-global-retailer.html)
|
|
561
|
+
- [Intigriti — CSRF Advanced Exploitation Guide](https://www.intigriti.com/researchers/blog/hacking-tools/csrf-a-complete-guide-to-exploiting-advanced-csrf-vulnerabilities)
|
|
562
|
+
- [Wikipedia — CSRF](https://en.wikipedia.org/wiki/Cross-site_request_forgery)
|