Skip to main content

Web application

Web application baseline scan

Daily passive scan against the running site for OWASP Top 10 exposure.

Awaiting next run

scan output missing

Checked 5/29/2026, 3:22:05 AM · Source: Continuous integration

ZAP baseline scan did not produce output. Common causes: docker not running on the runner, colima 9p mount permission issue, or ZAP container crash. Check the zap-baseline job logs in daily-security-scans for stack trace.

What this check means

An automated scan runs daily, performing the kind of inspection a security analyst would: spider the site, capture every response, and check for the patterns associated with the OWASP Top 10 vulnerability categories. Strictly passive — no payload injection, no fuzzing, safe to run against production.

Documented exclusions (19)

19 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 · 3

Recommended setting would break legitimate functionality. We accept the finding instead.

  • CSP: script-src unsafe-inline + wasm-unsafe-eval

    Two sub-rules under ZAP plugin 10055. (1) `unsafe-inline`: same trade-off as the Venom CSP exclusion — Next.js's React hydration requires inline `<script>` tags, and eliminating `unsafe-inline` requires a per-request nonce-based CSP threaded through every render path (a 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(), setTimeout(string), etc. Removing it breaks PDF export with `CompileError: WebAssembly.instantiate(): ... 'unsafe-eval' is not an allowed source`. The full `unsafe-eval` directive remains absent from the production CSP.

  • CSP: style-src unsafe-inline

    Tailwind CSS v4 + shadcn/ui inject runtime styles via inline `<style>` tags during hydration. Same nonce-based-CSP refactor would be needed to eliminate this. Tracked separately.

  • Cross-Origin-Embedder-Policy Header Missing or Invalid

    Same as Venom COEP exclusion. Setting `require-corp` breaks the Auth0 universal-login iframe, Google Ads creative iframes, and Cloudflare Turnstile. The hardening (cross-origin isolation for SharedArrayBuffer / high-resolution timers) is irrelevant — we don't use either.

Handled at the edge · 2

Path is blocked at the Cloudflare WAF before reaching our application.

  • Honeypot: dotenv probe

    Blocked at the Cloudflare WAF before reaching the worker. ZAP's view of this URL is the WAF's branded block page (which has its own CSP applied via the /errors/* Transform Rule). Findings against the WAF block page are not actionable in our app.

  • Honeypot: dotgit probe

    Blocked at the Cloudflare WAF. See /.env entry — same rationale.

False positives · 7

Scanner pattern-matched content that isn't actually a vulnerability — code samples, article text, framework markers.

  • Missing Anti-clickjacking Header on Cloudflare /cdn-cgi/* endpoints

    /cdn-cgi/* is the Cloudflare-managed reserved path used for challenges, bot-detection scripts, and edge-internal endpoints. These responses are served by the Cloudflare edge BEFORE our worker runs — our middleware.ts (which sets X-Frame-Options: DENY and frame-ancestors 'none' on every response) cannot attach headers to them. Cloudflare's challenge surface intentionally needs to be embeddable for the JS challenge to render in some flows. Headers on /cdn-cgi/content?id=... are Cloudflare's responsibility, not ours. All real application paths return both X-Frame-Options: DENY and CSP frame-ancestors 'none' (verified in middleware.ts). Closes #1067. Reviewed 2026-05-07.

  • Source Code Disclosure - SQL

    False positive on a documentation site. Pages like /comparisons/mysql-vs-postgresql, /code/database-connection-pooling, /architectures, etc. legitimately render SQL examples inside <pre>/<code> blocks as part of the article content. ZAP pattern-matches the SQL keywords and flags them as 'disclosure'. Real source code is in the repo, not exposed in the rendered HTML.

  • Information Disclosure - Suspicious Comments

    Next.js's React Server Components emit boundary markers as HTML comments (e.g. <!--$--> <!--/$-->) on every page. ZAP matches these against a list of suspicious comment keywords. They contain no real disclosure — they're framework-internal hydration markers.

  • Timestamp Disclosure - Unix

    False positive on article pages. /frameworks/<slug>, /hiring, /questions and similar render publication dates and 'updated at' timestamps in their content as integer seconds-since-epoch. These are public publication metadata, not internal timing leaks.

  • Dangerous JS Functions

    False positive on documentation pages. /code/rate-limiting-redis and /code render JavaScript code samples that *demonstrate* eval() / Function() usage as part of teaching the topic. The page itself doesn't execute these — they're string content inside <pre><code> blocks.

  • Information Disclosure - Debug Error Messages

    False positive on /code/* and /metrics/* documentation pages. ZAP's pattern matcher flags pages that contain words like 'error', 'exception', 'stack trace' in their text content. These are content articles ABOUT error handling and observability — they discuss the words, they don't leak runtime stacks.

  • Application Error Disclosure

    Same as 10023 — false positive on /metrics and /metrics/error-rate, content pages that describe error-rate dashboards and SRE patterns. The rendered HTML contains the word 'error' in normal prose; no stacks or internal paths are exposed.

Informational · 7

Scanner notes that the scanner itself classifies as informational, not actionable.

  • Modern Web Application

    Informational only. ZAP notes the site is a SPA / uses modern JS — not a vulnerability.

  • Non-Storable Content

    Informational only. ZAP notes that authenticated/dynamic responses don't ship Cache-Control: public — which is the correct behaviour for those paths (admin, api). Not a finding.

  • Retrieved from Cache

    Informational only — ZAP notes responses came from cache.

  • Re-examine Cache-control Directives

    Informational. ZAP suggests we verify our cache directives. We have intentional Cache-Control values per route class (public pages cacheable, /admin/* no-store, /robots.txt + /sitemap.xml short-TTL). Reviewed.

  • Storable and Cacheable Content

    Informational only — confirms cacheable content is correctly marked cacheable.

  • Storable but Non-Cacheable Content

    Informational only.

  • CSP: Notices

    Informational notice from CSP audit, not a finding.

Recent runs

WhenResultSource
5/29/2026, 3:22:05 AMscan output missingContinuous integration
5/28/2026, 3:25:19 AM0 high · 0 medium · 2 low · 4 excludedContinuous integration
5/27/2026, 3:24:15 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/26/2026, 3:21:29 AM0 high · 0 medium · 2 low · 4 excludedContinuous integration
5/25/2026, 3:17:59 AMscan output missingContinuous integration
5/24/2026, 3:22:56 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/23/2026, 3:19:03 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/22/2026, 3:22:19 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/21/2026, 6:16:27 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/21/2026, 3:23:36 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/20/2026, 3:21:25 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/19/2026, 3:20:43 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/18/2026, 3:20:52 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/17/2026, 3:21:04 AM0 high · 0 medium · 1 low · 7 excludedContinuous integration
5/16/2026, 3:16:39 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/15/2026, 3:20:48 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/14/2026, 3:19:31 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/13/2026, 3:20:37 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/12/2026, 3:18:07 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/11/2026, 3:20:45 AM0 high · 0 medium · 1 low · 7 excludedContinuous integration
5/10/2026, 3:18:55 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/9/2026, 5:34:07 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/9/2026, 3:13:57 AMscan output missingContinuous integration
5/8/2026, 4:54:56 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/8/2026, 3:56:21 AM0 high · 0 medium · 1 low · 6 excludedContinuous integration
5/7/2026, 3:20:13 AM0 high · 1 medium · 2 low · 5 excludedContinuous integration
5/6/2026, 3:24:30 AM0 high · 0 medium · 2 low · 5 excludedContinuous integration
5/5/2026, 3:38:39 AM0 high · 0 medium · 2 low · 6 excludedContinuous integration
5/4/2026, 3:20:06 AM0 high · 0 medium · 1 low · 4 excludedContinuous integration
5/4/2026, 12:51:04 AM0 high · 0 medium · 1 low · 4 excludedContinuous integration

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