Security Scan — All 19 Checks Documented
AIExposureTool's security scanner runs 19 passive, read-only checks on your live website. All scans are safe — we only check publicly visible information that any browser or attacker can already see.
Categories
HTTPS & Encryption
HTTPS enabled
CriticalWhat it checks
Verifies that your site serves content over HTTPS (TLS/SSL) rather than plain HTTP.
How it works
Checks whether the URL resolves to an HTTPS endpoint and that the TLS handshake completes successfully.
Why it matters
HTTP connections are unencrypted — anyone on the network can intercept credentials, session tokens, and user data. All modern sites must use HTTPS.
How to fix it
Configure your web server or CDN (Vercel, Cloudflare, Netlify) to serve all traffic over HTTPS. Most hosting platforms enable this with one click.
HTTP → HTTPS redirect
HighWhat it checks
Checks that plain HTTP requests are automatically redirected to HTTPS.
How it works
Makes a request to the HTTP version of your URL and checks for a 301 or 302 redirect to the HTTPS version.
Why it matters
Without an HTTP redirect, users who type your domain without 'https://' will be served insecure content. Search engines and AI crawlers also expect consistent HTTPS handling.
How to fix it
Configure a permanent 301 redirect from http:// to https://. Most hosting platforms have this as a one-click setting.
HSTS (HTTP Strict Transport Security) header
HighWhat it checks
Checks for the Strict-Transport-Security response header.
How it works
Inspects the HTTP response headers for Strict-Transport-Security with a non-zero max-age value.
Why it matters
HSTS tells browsers to always use HTTPS for your domain, even if a user manually types http://. It prevents SSL stripping attacks and is required for some compliance frameworks.
How to fix it
Add the header: Strict-Transport-Security: max-age=31536000; includeSubDomains. In Next.js, add it in next.config.js under headers().
Mixed content detection
MediumWhat it checks
Checks for HTTP resources (images, scripts, stylesheets) loaded on an HTTPS page.
How it works
Parses the page HTML for resource URLs beginning with http:// while the page is served over HTTPS.
Why it matters
Mixed content degrades security by loading some resources insecurely. Browsers block active mixed content (scripts, iframes) and warn on passive mixed content (images). It also causes browser security warnings.
How to fix it
Update all resource URLs to use https:// or protocol-relative URLs (//). Check CSS for background-image URLs and third-party embed codes.
Security Headers
Content-Security-Policy (CSP) header
HighWhat it checks
Checks for a Content-Security-Policy header in HTTP responses.
How it works
Inspects response headers for Content-Security-Policy or Content-Security-Policy-Report-Only.
Why it matters
CSP is the most powerful protection against Cross-Site Scripting (XSS) attacks. It restricts which scripts, styles, and resources can be loaded on your page. Missing CSP is one of the most commonly flagged issues in security audits.
How to fix it
Start with a restrictive policy and expand it: Content-Security-Policy: default-src 'self'. In Next.js, configure it in the headers() section of next.config.js.
X-Frame-Options header
MediumWhat it checks
Checks for the X-Frame-Options header.
How it works
Inspects response headers for X-Frame-Options with value DENY or SAMEORIGIN.
Why it matters
Without this header, your site can be embedded in an iframe by any domain — enabling clickjacking attacks where attackers trick users into clicking hidden buttons on your page.
How to fix it
Add: X-Frame-Options: DENY (recommended) or SAMEORIGIN. Note: modern CSP frame-ancestors directive supersedes X-Frame-Options, but both should be present for broad compatibility.
X-Content-Type-Options header
LowWhat it checks
Checks for the X-Content-Type-Options: nosniff header.
How it works
Inspects response headers for X-Content-Type-Options.
Why it matters
Prevents browsers from MIME-sniffing responses — treating a text file as executable JavaScript, for example. This prevents certain content injection attacks.
How to fix it
Add: X-Content-Type-Options: nosniff to all responses.
Referrer-Policy header
LowWhat it checks
Checks for a Referrer-Policy header.
How it works
Inspects response headers for Referrer-Policy.
Why it matters
Controls how much referrer information is sent when users navigate from your site. Without it, the browser default may leak sensitive URL path information to third-party sites.
How to fix it
Add: Referrer-Policy: strict-origin-when-cross-origin (the recommended balance between privacy and functionality).
Permissions-Policy header
LowWhat it checks
Checks for a Permissions-Policy header.
How it works
Inspects response headers for Permissions-Policy (previously Feature-Policy).
Why it matters
Controls access to browser features (camera, microphone, geolocation, etc.) for your page and embedded iframes. Prevents malicious third-party scripts from accessing features your site doesn't use.
How to fix it
Add a restrictive policy: Permissions-Policy: camera=(), microphone=(), geolocation=() for features your site doesn't use.
Exposed Files
.env file public accessibility
CriticalWhat it checks
Checks whether your .env file is publicly accessible at /.env.
How it works
Makes a request to [yourdomain]/.env and checks for a 200 response with key=value content patterns.
Why it matters
.env files contain your most sensitive secrets: database passwords, API keys, JWT secrets, payment processor keys. If publicly accessible, any attacker can steal all of them with a single GET request.
How to fix it
Never place .env files in your public directory. Ensure your server or CDN returns 403 or 404 for /.env. In Next.js and most frameworks, .env files are never served publicly by default — this usually only happens when files are placed in /public/ by mistake.
.git directory exposure
CriticalWhat it checks
Checks whether your .git directory is publicly accessible at /.git/.
How it works
Makes a request to [yourdomain]/.git/HEAD and checks for a recognizable git ref response.
Why it matters
An exposed .git directory allows attackers to reconstruct your entire source code — including all secrets ever committed to the repo, deleted files, and full commit history. This is one of the most severe possible exposures.
How to fix it
Configure your web server to block access to /.git/. In Nginx: location ~ /\.git { deny all; }. In most managed hosting (Vercel, Netlify, Railway), the .git directory is never served publicly.
Source maps (.js.map) in production
MediumWhat it checks
Checks whether JavaScript source map files are publicly accessible in production.
How it works
Checks response headers for X-SourceMap or SourceMap headers, and scans JS files for //# sourceMappingURL comments pointing to .map files.
Why it matters
Source maps expose your original, unminified source code — including file names, code comments, and sometimes environment variables set in code. They're useful in development but should not be deployed to production.
How to fix it
Disable source map generation in your production build. In Next.js: productionBrowserSourceMaps: false in next.config.js. In Vite: build: { sourcemap: false }.
Sensitive configuration files
MediumWhat it checks
Checks for publicly accessible configuration files at common paths.
How it works
Probes a list of common sensitive file paths: /.env.production, /.env.local, /config.json, /wp-config.php, /credentials.json, and others.
Why it matters
Misconfigured deployments sometimes accidentally expose configuration files that contain secrets or infrastructure details.
How to fix it
Verify all sensitive config paths return 403 or 404. Add rules to your web server config to block access to common sensitive file patterns.
API Key Leaks
API key leaks in HTML and JavaScript bundles
CriticalWhat it checks
Scans your page's HTML and all linked JavaScript bundle files for 17 known API key and secret patterns.
How it works
Fetches your homepage HTML and all JavaScript bundle files referenced in it (<script src='...'>). Scans the full content of each file against 17 regex patterns for known secret formats.
Why it matters
This is the most common critical vulnerability in AI-built apps. When developers use Cursor, Claude, or ChatGPT to write code, AI assistants sometimes generate code that references API keys directly in client-side files. These keys end up in your bundled JavaScript and are publicly visible to anyone who visits your site — and to automated scanners.
How to fix it
Move all API keys to server-side environment variables. On the client side, call your own backend API (which reads the key from process.env) rather than calling third-party APIs directly. Use the copy-paste fix prompt in your scan report for a specific prompt tailored to your exact leaked key type.
API key patterns detected (17)
Admin Endpoint Exposure
Admin endpoint and debug interface exposure
HighWhat it checks
Checks whether admin panels, database interfaces, or debug endpoints are publicly accessible.
How it works
Probes common admin paths: /admin, /phpmyadmin, /graphql (with introspection enabled), /api/graphql, /_debug, /debug, and similar paths.
Why it matters
Exposed admin panels are a high-value target for attackers. GraphQL introspection enabled in production leaks your entire API schema. Debug interfaces can expose stack traces, environment variables, and internal state.
How to fix it
Restrict admin paths to authenticated users only. Disable GraphQL introspection in production (most GraphQL libraries have a setting for this). Remove debug endpoints entirely from production builds.
Information Disclosure & WAF
Server info disclosure (X-Powered-By)
LowWhat it checks
Checks for the X-Powered-By header that discloses your technology stack.
How it works
Inspects response headers for X-Powered-By.
Why it matters
Headers like X-Powered-By: Express or X-Powered-By: Next.js tell attackers which framework you're running, enabling targeted exploitation of known framework vulnerabilities. It's low-cost to remove and eliminates a free reconnaissance signal.
How to fix it
Remove or suppress the X-Powered-By header. In Next.js: poweredByHeader: false in next.config.js. In Express: app.disable('x-powered-by').
WAF and rate limiting detection
InfoWhat it checks
Checks for the presence of a Web Application Firewall (WAF) and rate limiting headers.
How it works
Checks response headers for known WAF signatures: CF-Ray (Cloudflare), x-amzn-RequestId (AWS WAF), X-Sucuri-ID, X-Akamai-*, Fastly-*, Imperva-*. Also checks for RateLimit-* and X-RateLimit-* headers.
Why it matters
This is an informational check — a passing result means your site has WAF and rate limiting protection, which reduces your attack surface. A failing result is a recommendation to add these protections rather than a critical vulnerability.
How to fix it
Use Cloudflare (free tier available), AWS WAF, or Vercel's DDoS protection. Add rate limiting to your API routes — in Next.js, libraries like rate-limiter-flexible or Upstash Redis make this easy.
Passive scanning — what this means
All 19 checks are passive and read-only. The scanner only fetches resources that are already publicly accessible — the same GET requests a browser makes when visiting your site. There are no login attempts, form submissions, fuzzing requests, payloads, or intrusive probes of any kind. The scan is completely safe to run on production sites and will not trigger security alerts, WAF blocks, or rate limiting on well-configured sites.
Run a free security scan
All 19 checks on your live site in under 15 seconds. Security Grade (A-F) and full issue breakdown. Free — no signup required.