Skip to main content

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

WhenResultSource
5/29/2026, 3:16:16 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/28/2026, 3:17:50 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/27/2026, 3:22:52 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/26/2026, 3:19:03 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/25/2026, 3:17:53 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/24/2026, 3:19:39 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/23/2026, 3:14:29 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/22/2026, 3:19:08 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/21/2026, 6:14:28 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/21/2026, 3:16:50 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/20/2026, 3:22:22 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/19/2026, 3:18:38 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/18/2026, 3:18:06 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/17/2026, 3:15:09 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/16/2026, 3:14:08 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/15/2026, 3:17:16 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/14/2026, 3:14:12 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/13/2026, 3:15:15 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/12/2026, 3:15:07 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/11/2026, 3:17:06 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/10/2026, 3:14:28 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/9/2026, 5:27:23 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/9/2026, 3:13:49 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/8/2026, 4:48:37 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/8/2026, 3:53:01 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/7/2026, 3:16:40 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/6/2026, 3:15:09 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/5/2026, 3:32:30 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/5/2026, 3:14:20 AM12/17 passed · 0 actionable · 5 excludedContinuous integration
5/4/2026, 3:18:55 AM12/17 passed · 0 actionable · 5 excludedContinuous integration

Need additional detail (sanitised report, supporting evidence)? security@theartofcto.com