brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
plan-input-validationPlan-only trust-boundary audit for missing validation, injection, XSS, and forged requests across forms, APIs, and webhooks. Use when "validate my inputs", "is my app injection-safe?", "check my forms", or "can someone forge requests?".
Independent GitHub snapshot · Automated classification · Original documentation governs
Degree of freedom: HIGH — map trust boundaries, score gaps, emit a plan. Stay plan-only. No Zod, sanitizers, or webhook edits until approved.
| Skill | Owns |
|---|---|
| plan-input-validation (this) | Trust-boundary / injection plan |
enhance-web-forms | Apply production form quality |
plan-security-audit | OWASP umbrella burndown |
Role: Senior application security engineer (trust-boundary lens).
Task: Map every point untrusted data enters, score validate/sanitize/authenticate
gaps, phase remediations, emit plan-input-validation.md. Audit & plan only — no
code changes until each phase is approved.
Walk every boundary. Find what's trusted that shouldn't be. Change nothing until approved.
Propose: verify the Stripe webhook with
constructEventon the raw body; reject empty secrets; return 400 on bad signatures. Risk: empty-signing-secret bypass — anyone can forgeinvoice.paidand credit quota. Keep-working: checkout session creation already uses the server-side secret. Phase: Phase 1 — Forgeable money/data paths. Note: origin proof ≠ safe to interpolate into SQL/HTML.
AI agents write code that works on the inputs you showed them. Two signature patterns
recur: dangerouslySetInnerHTML without DOMPurify (XSS), and webhook handlers without
real signature verification — the reported empty-signing-secret bypass class, where an
empty secret lets any attacker forge valid signatures and credit unlimited quota
without payment.
This skill is the audit-and-plan half. Execution goes to backend-patterns /
backend-error-handling / audit-security after you approve each phase.
Trigger phrases: "validate my inputs", "is this injection-safe", "check my forms / API", "XSS", "dangerouslySetInnerHTML", "my Stripe webhook", "can requests be forged", "sanitize user content", "pre-launch input hardening".
Do not fire for: row-level access (plan-rls-audit), credential exposure
(plan-secrets-audit), or broad architecture review (plan-security-audit).
This skill owns the boundary where untrusted data enters.
Number(req.body.amount) with no bounds.req.body into DB insert/update (role,
is_admin, credits).dangerouslySetInnerHTML / v-html / innerHTML without DOMPurify.javascript: URIs, unvalidated redirects.JSON.stringify(req.body) instead of raw bytes.plan-input-validation.md, then end the turn with a standalone recap in chat: the two or three highest-impact findings and the first phase to approve. The file is the deliverable — write it before the recap. Do not edit code.plan-rls-audit; leaked keys → plan-secrets-audit; OWASP umbrella → plan-security-auditplan-input-validation.md# Input-Validation & Trust-Boundary Audit — <repo>
_Audit-only. Nothing changes until each phase is approved._
## Scope
- Boundaries found: forms / API / webhooks / uploads / rendered content
- Stack: Supabase ☐ Stripe ☐ Next.js ☐ | Assumptions: …
## Verdict
| Boundary class | Findings | Critical | Unauthenticated write reachable? |
|----------------|----------|----------|----------------------------------|
| Form & API | n | n | … |
| Rendered (XSS) | n | n | … |
| Webhooks | n | n | … |
| Uploads/other | n | n | … |
## Findings
| # | Boundary | path:line | Missing: validate/sanitize/authenticate | Sev | Direction |
|---|----------|-----------|-----------------------------------------|-----|-----------|
| I1 | Stripe webhook | api/webhooks/stripe.ts:12 | authenticate (no constructEvent) | Crit | verify raw body against secret; 400 on fail |
| I2 | comment render | Comment.tsx:30 | sanitize (dangerouslySetInnerHTML) | High | DOMPurify before render |
| I3 | profile update | actions/profile.ts:8 | validate (mass assignment) | High | Zod allowlist; drop role/credits |
## Phased burndown
- **Phase 1 — Forgeable money/data paths** → `backend-patterns` — webhooks, mass-assign
- **Phase 2 — XSS / rendered content** → `backend-error-handling` / `enhance-web-ux` — I2…
- **Phase 3 — Schema validation pass** → `backend-patterns` — Zod at every boundary
- **Phase 4 — Uploads & concurrency** → `audit-security` — files, races
## Execution handoff
Approve a phase to run it. Re-run after; for webhooks, verify with Stripe CLI
fixtures (real signed events) not mocked payloads.
plan-rls-audit;
credentials: plan-secrets-audit.backend-patterns, backend-error-handling, audit-security,
audit-fe-api.test-red-team + Stripe CLI signed webhook fixtures.Plan at high effort. Execute after approval at the default effort under
approved-plan-execution.mdc(no reward hacking, no feature deletion). The plan says which boundaries are open; the rule constrains how they're closed.