Browser security
OWASP secure headers
OWASP Secure Headers Project validator runs daily against production.
Healthy
12/17 passed · 0 actionable · 5 excluded
Checked 5/29/2026, 3:16:16 AM · Source: Continuous integration
OWASP Secure Headers Project Venom validator. Tests against the OSHP recommendations (CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Resource-Policy, etc). 5 test(s) deliberately excluded with documented rationale (Content-Security-Policy, Referrer-Policy, Clear-Site-Data, Cross-Origin-Embedder-Policy, Cache-Control) — see findings list (severity=info) or .venomignore.json for the full justification per test.
What this check means
We use the OWASP Secure Headers Project (OSHP) reference validator — Venom-based — to test our HTTP response headers against OSHP recommendations. Tests cover Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Resource-Policy and others. The official OWASP YAML test suite is fetched fresh each run.
Documented exclusions (5)
5 finding types are deliberately not actioned here. Grouped by reason below — we publish them so the trade-offs and false-positive suppressions are visible and reviewable, not hidden.
Trade-offs · 5
Recommended setting would break legitimate functionality. We accept the finding instead.
Content-Security-Policy
OWASP requires CSP without `unsafe-inline` or any `eval` family directive. Two intentional deviations: (1) `unsafe-inline` — Next.js's React hydration requires inline `<script>` tags; eliminating it needs a per-request nonce-based CSP threaded through every render path (substantial refactor that also has to coexist with our 6 third-party scripts: Cloudflare Insights, Sentry, Auth0, Google Ads, Microsoft Clarity, Google Analytics). (2) `wasm-unsafe-eval` — required in production for client-side PDF export (@react-pdf/renderer compiles a WASM font/layout module via WebAssembly.instantiate). This is the narrow modern directive that permits WASM compile/instantiate ONLY — it does NOT permit JS eval(), new Function(), or string-form setTimeout. Removing it breaks PDF export with a CompileError. The broad `unsafe-eval` remains absent from the production CSP.
Referrer-Policy
OWASP requires `no-referrer`. We use `strict-origin-when-cross-origin` because Sentry session-replay, Auth0 universal-login callback, and Google Analytics all rely on the Referer header for attribution and correlation. Stripping referrer breaks observability and conversion tracking with no security gain on a same-site product.
Clear-Site-Data
OWASP recommends Clear-Site-Data on every response. Applied globally, this wipes cookies/storage on every page load — every navigation logs the user out. We only emit this header on the explicit logout endpoint (workers/api/src/routes/auth/logout/route.ts), where it's the correct behaviour.
Cross-Origin-Embedder-Policy
OWASP requires `require-corp`. Setting this breaks the Auth0 universal-login flow (uses cross-origin iframes for the login UI), Google Ads creative iframes, and Cloudflare Turnstile. The hardening it provides (cross-origin isolation for SharedArrayBuffer / high-resolution timers) is irrelevant to our app — we don't use either.
Cache-Control
OWASP wants `Cache-Control: no-store, max-age=0` on every response. Applied globally that disables Cloudflare's edge cache for our public content (insights, frameworks, comparisons, etc.) and forces every page render through OpenNext on the worker — slower for users, more expensive at scale. We apply `no-store` selectively on authenticated paths (/admin, /dashboard, /command-center, etc.) where it's correct, and let public content cache. The OWASP test reflects a security-paranoid posture more appropriate for fully-authenticated apps than for content sites with a public surface.
Recent runs
| When | Result | Source | |
|---|---|---|---|
| 5/29/2026, 3:16:16 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/28/2026, 3:17:50 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/27/2026, 3:22:52 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/26/2026, 3:19:03 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/25/2026, 3:17:53 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/24/2026, 3:19:39 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/23/2026, 3:14:29 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/22/2026, 3:19:08 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/21/2026, 6:14:28 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/21/2026, 3:16:50 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/20/2026, 3:22:22 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/19/2026, 3:18:38 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/18/2026, 3:18:06 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/17/2026, 3:15:09 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/16/2026, 3:14:08 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/15/2026, 3:17:16 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/14/2026, 3:14:12 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/13/2026, 3:15:15 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/12/2026, 3:15:07 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/11/2026, 3:17:06 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/10/2026, 3:14:28 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/9/2026, 5:27:23 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/9/2026, 3:13:49 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/8/2026, 4:48:37 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/8/2026, 3:53:01 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/7/2026, 3:16:40 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/6/2026, 3:15:09 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/5/2026, 3:32:30 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/5/2026, 3:14:20 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration | |
| 5/4/2026, 3:18:55 AM | 12/17 passed · 0 actionable · 5 excluded | Continuous integration |
Need additional detail (sanitised report, supporting evidence)? security@theartofcto.com