Security & remediation
Independently audited against OWASP Top 10 and API Top 10. All four verified findings are resolved — three fixed in code, one corrected in documentation — and twelve security areas were examined and cleared, with no false positives.
Posture
What we checked & cleared
12 security categories examined and found secure — authentication, input validation, rate limiting, data exposure, transport headers, file upload, dependencies, cryptography, concurrency, business logic, logging and documentation accuracy. No reported issue turned out to be a false positive requiring rejection.
dangerouslySetInnerHTML, eval or raw HTML injection anywhere in custom codepnpm audit)Findings — before & after
Access control on contact submissions
The contact-submissions collection accepted creates from any caller, so a direct API write could slip past the rate limit and IP-hashing that only the Server Action applies.
Create is now restricted to Payload's in-process Local API — the path the rate-limited Server Action uses — so public REST and GraphQL writes are rejected, with a regression test guarding against recurrence. ContactSubmissions.ts:11
GitHub-stars endpoint was not rate-limited
The public GitHub-stars endpoint didn't apply its rate limiter, so a flood of requests for distinct repositories could slip past the cache and exhaust the upstream GitHub API quota.
The route now checks the limiter before doing any work and returns 429 with a Retry-After header once the limit is exceeded. route.ts:19
Media uploads had no enforced size limit
The media collection whitelisted file types but didn't enforce the documented 5 MB ceiling, so an oversized image could strain disk and memory during processing.
A 5 MB limit is now enforced in a beforeChange hook that rejects oversized files. Media.ts:4,31
Documentation overstated file-validation controls
Security docs claimed magic-byte file validation that the implementation didn't perform — it trusted the client-supplied content type only.
The claim was corrected to match reality. Active controls are admin-only upload, a type whitelist and the 5 MB cap; deep content validation is tracked as later hardening.
Severity & categories
How this was done
Found and fixed with a multi-agent security pipeline
Automated recon mapped every entry point; parallel per-category auditors probed for OWASP-class issues; and a deep-dive verifier re-checked each candidate to strip out false positives — none survived here. Test quality was reviewed alongside the code, and every fix shown on this page was re-verified against the current source when it was generated, with a regression test guarding the highest-impact fix.