plan-input-validation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited plan-input-validation (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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 withconstructEventon 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).
javascript: URIs, unvalidated redirects.(empty-secret bypass class).
JSON.stringify(req.body) instead of raw bytes.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.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.