Skip to main content

Browser security

OWASP secure headers

OWASP Secure Headers Project validator runs daily against production.

Attention

11/17 passed · 1 actionable · 5 excluded

Checked 7/30/2026, 3:08:00 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
7/30/2026, 3:08:00 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/29/2026, 3:07:02 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/28/2026, 3:08:16 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/27/2026, 3:10:34 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/26/2026, 3:08:46 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/25/2026, 3:07:22 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/24/2026, 3:08:18 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/23/2026, 3:08:28 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/22/2026, 3:08:39 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/21/2026, 3:08:31 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/20/2026, 3:09:38 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/19/2026, 3:08:59 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/18/2026, 3:07:00 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/17/2026, 3:08:02 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/17/2026, 12:03:17 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/16/2026, 3:07:55 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/15/2026, 3:07:57 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/14/2026, 3:07:29 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/13/2026, 3:10:05 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/12/2026, 3:09:03 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/11/2026, 3:08:12 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/10/2026, 3:10:45 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/9/2026, 3:11:18 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/8/2026, 3:08:58 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/7/2026, 3:11:19 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/6/2026, 3:13:28 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/5/2026, 3:12:07 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/4/2026, 12:15:45 PM11/17 passed · 1 actionable · 5 excludedContinuous integration
7/1/2026, 12:03:29 AM11/17 passed · 1 actionable · 5 excludedContinuous integration
6/30/2026, 3:18:49 AM11/17 passed · 1 actionable · 5 excludedContinuous integration

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