Security
· 32 checks — HTTP headers, CSP, TLS handshake, and cookie hygiene rolled into one auditable list.FSecurity HeadersAction2 of 10 headers properly configuredFIX
Without includeSubDomains, subdomains can still be accessed over HTTP.
max-age=31536000; includeSubDomainsWithout includeSubDomains, a forgotten dev subdomain over HTTP can set malicious cookies that ride to the apex.
Learn more ▾ ▴
HSTS without includeSubDomains protects only the exact domain. Cookies set on a non-HSTS subdomain can ride to the apex via cookie-scope attacks. The fix is one directive append. Verify all subdomains support HTTPS first — adding includeSubDomains to a domain with HTTP-only subdomains breaks them.
Source: RFC 6797
This header prevents MIME-type sniffing, which can lead to XSS attacks. Set it to 'nosniff'.
nosniffMIME sniffing lets browsers run uploaded files as JavaScript, turning a file upload into an XSS.
Learn more ▾ ▴
Setting X-Content-Type-Options: nosniff tells browsers to trust your declared Content-Type instead of guessing. Without it, an attacker who uploads a polyglot file can sometimes get it executed as a script. One header, no downside.
Source: OWASP / MDN
DENY or SAMEORIGINAn unrecognized X-Frame-Options value falls back to browser default behavior — clickjacking protection silently disabled.
Learn more ▾ ▴
X-Frame-Options accepts only DENY, SAMEORIGIN, or ALLOW-FROM (deprecated). Anything else (including typos like SAMEORIGN, or modern CSP-style frame-ancestors values shoved in by mistake) is ignored. The header LOOKS protective but isn't. Use `X-Frame-Options: DENY` plus `Content-Security-Policy: frame-ancestors 'none'` for defense in depth.
Source: MDN X-Frame-Options
Controls how much referrer information is sent with requests. Set to 'strict-origin-when-cross-origin' or stricter.
strict-origin-when-cross-originDefault browser behavior leaks full URLs (including query params and tokens) to every third-party resource — set a strict policy.
Learn more ▾ ▴
Without a Referrer-Policy header, browsers send the full referring URL with images, scripts, and fonts loaded from third-party origins. URLs containing tokens, user IDs, or session params end up in third-party logs. Set `Referrer-Policy: strict-origin-when-cross-origin` (or stricter) to limit leakage.
Source: MDN / W3C
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
COOP isolates your browsing context, preventing cross-origin side-channel attacks. Set to 'same-origin'.
same-originCOOP isolates your top-level browsing context from cross-origin windows — without it, popup-based side-channel attacks remain possible.
Learn more ▾ ▴
Cross-Origin-Opener-Policy: same-origin prevents cross-origin pages from sharing a browsing-context group with yours. This blocks cross-window references that enable Spectre-style timing attacks and tab-nabbing. Required if you want to enable SharedArrayBuffer.
Source: MDN / web.dev
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
The Server header discloses the software version, aiding attackers in targeting known vulnerabilities. Remove the version number.
Server: nginx/1.18.0 tells attackers exactly which CVEs to test — strip the version string.
Learn more ▾ ▴
Server version disclosure helps attackers select exploits matching your stack. Configure your server to omit the version (nginx: `server_tokens off;`, Apache: `ServerTokens Prod`). Doesn't fix vulnerabilities but removes the easy reconnaissance step.
Source: OWASP
Submit your domain to hstspreload.org to close the trust-on-first-use gap. Requires a preload-ready HSTS header (max-age=31536000+, includeSubDomains, preload).
Not in the Chrome preload list — first-time visitors over plain HTTP can be downgraded by a network attacker before HSTS kicks in.
Learn more ▾ ▴
The HSTS header only protects users who have already visited the site (TOFU window). Adding your domain to the Chrome preload list closes that gap so HSTS is enforced from the very first connection. Requires a preload-ready header (max-age=31536000+, includeSubDomains, preload) then submission at hstspreload.org. Inclusion ships in the next Chrome release after acceptance.
Source: hstspreload.org
FEmpty Page DetectionAction1 empty-page signal(s) detected -- page may be a placeholder or have content-rendering bugsFIX
FSubresource Integrity AdoptionAction0% SRI adoption (0/4 third-party resources)FIX
FSubresource IntegrityAction0 of 4 external resources have SRIFIX
| Tag | Domain | Integrity |
|---|---|---|
| <link> | telegram.org | ✗ Missing |
| <link> | telegram.org | ✗ Missing |
| <link> | telegram.org | ✗ Missing |
| <script> | telegram.org | ✗ 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=()
BContent Security Policy2 of 10 CSP checks passedREVIEW
default-src provides a fallback for other directives. Set it to restrict default resource loading.
default-src 'self'Security gaps expose your site and users to attacks, eroding trust.
Without base-uri, attackers can inject a <base> tag to hijack relative URLs. Set it to 'self' or 'none'.
base-uri 'self'Missing base-uri in CSP leaves a base-tag injection attack path open even on otherwise strict policies.
Learn more ▾ ▴
A common omission: developers add CSP for script-src and frame-ancestors but forget base-uri. The result is a CSP that looks strict but lets an attacker rewrite every URL on the page via <base href>. Add `base-uri 'self'` to close the gap.
Source: MDN CSP
form-action restricts where forms can submit data, preventing form hijacking.
form-action 'self'Security gaps expose your site and users to attacks, eroding trust.
This directive upgrades HTTP resources to HTTPS automatically, preventing mixed content.
upgrade-insecure-requestsWithout upgrade-insecure-requests, any HTTP subresource link survives as a mixed-content warning instead of auto-upgrading.
Learn more ▾ ▴
Adding `upgrade-insecure-requests` to your CSP turns every http:// subresource fetch into https:// at the browser layer. One-line defense against accidental mixed content from legacy links or third-party widgets.
Source: MDN CSP
Parsed Policy
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
BReferrer-Policy StrictnessReferrer-Policy header not set -- browser default applies (modern: strict-origin-when-cross-origin; legacy browsers: no-referrer-when-downgrade)REVIEW
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
ATLS & CertificatesTLS 1.3, 8 checks passedPASS
Renew the certificate before it expires to avoid browser warnings.
Cert expiry within the renewal window — fix now while there's no user impact, instead of after expiry when there's a full outage.
Learn more ▾ ▴
Most CAs recommend renewal at 30 days remaining. Inside that window, schedule the renewal immediately and verify auto-renewal is configured if applicable. Don't wait until 7 days; weekend / holiday timing can leave you exposed.
Source: Let's Encrypt / CA renewal best practice
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 SafetyNo new-tab links found -- no tabnabbing surfacePASS
A+CSP Inline-Style ReadinessNo inline style attributes -- strict CSP is feasiblePASS
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+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 | — |
AEmail SecurityDMARC: reject, SPF: -all, DKIMPASS
The policy file exists but no _mta-sts TXT record was found. Senders rely on the TXT record to discover and version the policy.
MTA-STS policy file is reachable but no _mta-sts TXT record exists, so senders can't discover or version-pin the policy.
Learn more ▾ ▴
Senders look up the _mta-sts TXT record first to learn the current policy ID; without it they treat the policy as absent. Publish a TXT record at _mta-sts.<domain> with v=STSv1; id=<policy-version>.
Source: RFC 8461 §3.1
Without rua=, you have no visibility into spoof attempts or auth failures from your own legitimate senders. Add rua=mailto:dmarc@<your-domain> (or a managed inbox at a reporting service).
Informational: a Permissions-Policy directive showing feature -> allowed origins.
Source: MDN Permissions-Policy
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.