Security
· 32 checks — HTTP headers, CSP, TLS handshake, and cookie hygiene rolled into one auditable list.DCSP Inline-Style ReadinessAction175 inline style attribute(s) detectedFIX
FSubresource Integrity AdoptionAction0% SRI adoption (0/77 third-party resources)FIX
DReferrer-Policy StrictnessActionReferrer-Policy is `no-referrer-when-downgrade` (leaky -- legacy default that sends full URL cross-origin on HTTPS-to-HTTPS)FIX
FSubresource IntegrityAction0 of 77 external resources have SRIFIX
| Tag | Domain | Integrity |
|---|---|---|
| <link> | b.stripecdn.com | ✗ Missing |
| <link> | b.stripecdn.com | ✗ Missing |
| <link> | b.stripecdn.com | ✗ Missing |
| <link> | b.stripecdn.com | ✗ Missing |
| <link> | b.stripecdn.com | ✗ Missing |
| <link> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
| <script> | b.stripecdn.com | ✗ Missing |
DPermissions-PolicyActionNo header setFIX
No Permissions-Policy header set.
Without this header, embedded iframes can request access to sensitive device features.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()
BSecurity Headers7 of 10 headers properly configuredREVIEW
Controls which browser features (camera, microphone, geolocation) are allowed. Set it to restrict unused features.
geolocation=(), camera=(), microphone=()Permissions-Policy locks down browser APIs you don't use — without it, every page can request camera/mic/geolocation if XSS lands.
Learn more ▾ ▴
By default every page can request the camera, microphone, geolocation, payment APIs, and dozens more. Permissions-Policy turns off the ones you don't need so a future bug can't quietly start using them. It's a defense-in-depth header — one line, big surface reduction.
Source: MDN / W3C
COEP prevents loading cross-origin resources without explicit permission. Required for SharedArrayBuffer and high-resolution timers.
require-corpCOEP enforces that all embedded resources opt-in to cross-origin embedding — required for cross-origin isolation features.
Learn more ▾ ▴
Cross-Origin-Embedder-Policy: require-corp ensures every embedded resource (script, iframe, image) explicitly allows being loaded cross-origin. Combined with COOP, this enables the cross-origin-isolated context that unlocks SharedArrayBuffer, high-resolution timers, and other powerful APIs.
Source: MDN / web.dev
same-originCOOP is set to a less-restrictive value (same-origin-allow-popups or unsafe-none) — partial isolation only.
Learn more ▾ ▴
COOP: same-origin is the strictest level. same-origin-allow-popups allows authenticated popup windows back to your origin. unsafe-none is the legacy default (effectively off). Pick the strictest level your app's popup flows tolerate.
Source: MDN COOP
BWAF / Bot ProtectionNo WAF detected via response headersREVIEW
Bsecurity.txtVulnerability disclosure policyREVIEW
security.txt
BTrusted Types (XSS Sink Hardening)Trusted Types not enabledREVIEW
CPermissions-Policy GranularityActionNo Permissions-Policy header set -- powerful features (camera / microphone / geolocation / payment / USB) default to allow-on-same-originREVIEW
BEmail SecurityDMARC: reject, SPF: ~all, DKIMREVIEW
Soft fail tells receivers to accept-but-mark unauthorized mail. Migrate to -all once you've confirmed all legitimate senders are listed (DMARC aggregate reports help verify).
Informational: a labeled value pair from the audit.
MTA-STS forces inbound mail to use TLS, preventing downgrade attacks. Requires both a TXT record at _mta-sts.<domain> and a policy file at https://mta-sts.<domain>/.well-known/mta-sts.txt.
Without MTA-STS, inbound mail can be silently downgraded to plain SMTP by a network attacker.
Learn more ▾ ▴
MTA-STS (RFC 8461) tells sending mail servers to use TLS and to refuse delivery if TLS fails. Requires both a TXT record at _mta-sts.<domain> AND a policy file at https://mta-sts.<domain>/.well-known/mta-sts.txt. Without it, an active attacker on the network path can strip STARTTLS and read the email in plaintext.
Source: RFC 8461
TLS-RPT (RFC 8460) lets MTAs report TLS-handshake failures, so you can detect and fix MTA-STS misconfigurations. Add a TXT record at _smtp._tls.<domain>.
Without TLS-RPT, you have no visibility into inbound TLS failures — MTA-STS misconfigurations stay hidden until users complain.
Learn more ▾ ▴
TLS-RPT (RFC 8460) is the feedback channel for MTA-STS: senders post aggregate reports of TLS-handshake failures to the URI in your _smtp._tls TXT record. Without it, an MTA-STS misconfiguration silently rejects mail and you find out only when someone notices missing email.
Source: RFC 8460
BIMI (Brand Indicators for Message Identification) lets supporting clients (Gmail, Apple Mail, Yahoo) display your verified logo next to your messages. Optional but raises trust signals. Requires DMARC at p=quarantine or p=reject to be honored.
Security gaps expose your site and users to attacks, eroding trust.
BCORS ConfigurationNo CORS headersREVIEW
No CORS headers detected.
Cross-origin requests are blocked by browser same-origin policy.
Origin reflection test
Some servers mirror the request Origin header, which can be exploited. Test manually:
curl -sI -H "Origin: https://evil.com" <url> | grep -i access-control
A+Content Security Policy9 of 10 CSP checks passedPASS
Parsed Policy
A+TLS & CertificatesTLS 1.3, 7 checks passedPASS
HTTP/2 provides multiplexing and header compression for better performance.
HTTP/1.1 forces the browser to make sequential requests, multiplying latency on every page.
Learn more ▾ ▴
HTTP/2 (and HTTP/3) multiplex many requests over a single connection, eliminating head-of-line blocking. HTTP/1.1 forces the browser to either queue requests or open many parallel connections — both worse. Most modern web servers support HTTP/2 with one config line.
Source: MDN Web Docs
Without stapling, the browser performs a separate OCSP roundtrip on first connection -- adding latency and leaking the visited host to the CA. Enable OCSP stapling on your TLS server.
Without OCSP stapling, every first-time visitor pays an extra OCSP roundtrip — and the CA learns who's visiting your site.
Learn more ▾ ▴
OCSP stapling has the server fetch its own revocation status from the CA and attach the signed response to the TLS handshake. Without it, browsers contact the CA directly: extra latency for the user and a privacy leak (the CA sees who connected). Enable ssl_stapling on (nginx) / SSLUseStapling On (Apache) / OCSPStapling = on (Caddy auto-enables).
Source: RFC 6961 / Mozilla Server-Side TLS guide
Certificate Chain
A+Cross-Origin Tab SafetyAll 1 new-tab link(s) carry rel=noopenerPASS
A+Bot Challenge DetectionScan reached real page content (no bot-protection interstitial)PASS
A+Soft-404 DetectionNo soft-404 patterns detected in page title or headingsPASS
A+Empty Page DetectionPage has substantive body text and no placeholder / template-leak signalsPASS
A+Geo-Restriction DetectionNo geo-restriction signals detected -- scan reached the page from an allowed regionPASS
A+Maintenance Mode DetectionNo maintenance-mode signals detected -- scan reached a normal pagePASS
A+CORS DepthNo CORS response headers -- the resource is same-origin-only by browser defaultPASS
A+Source Map ExposureSource-map probe didn't run on this scanPASS
A+HTML Version DisclosureNo software-version disclosures in HTMLPASS
A+Open Redirect SurfaceNo redirect-shaped query parameters in DOM linksPASS
A+Auth SecurityPage is not a login form -- auth-security checks are N/APASS
A+Subdomain Inventory ExposureNo risky subdomain names in certificate SANsPASS
A+JS Library VulnerabilitiesNo known vulnerabilitiesPASS
No known JavaScript library vulnerabilities detected.
A+Information LeakageNo exposuresPASS
No sensitive files exposed — all paths returned 404.
| Path | Status | Category | Risk |
|---|---|---|---|
| /.git/HEAD | ✓ Not found | Version Control | — |
| /.git/config | ✓ Not found | Version Control | — |
| /.svn/entries | ✓ Not found | Version Control | — |
| /.env | ✓ Not found | Configuration | — |
| /.env.local | ✓ Not found | Configuration | — |
| /.env.production | ✓ Not found | Configuration | — |
| /wp-config.php | ✓ Not found | Configuration | — |
| /.htaccess | ✓ Not found | Configuration | — |
| /phpinfo.php | ✓ Not found | Debug | — |
| /server-status | ✓ Not found | Debug | — |
| /server-info | ✓ Not found | Debug | — |
| /.well-known/security.txt | ✗ Exposed | Security Policy | Info |
| /package.json | ✓ Not found | dependency-manifest | — |
| /composer.json | ✓ Not found | dependency-manifest | — |
| /Gemfile | ✓ Not found | dependency-manifest | — |
| /Gemfile.lock | ✓ Not found | dependency-manifest | — |
| /requirements.txt | ✓ Not found | dependency-manifest | — |
| /pom.xml | ✓ Not found | dependency-manifest | — |
| /.gitlab-ci.yml | ✓ Not found | ci-config | — |
| /.travis.yml | ✓ Not found | ci-config | — |