Field Manual

The remediation checklist

Every gap our scanner looks for, each with a copy-paste-exact fix and a one-line way to confirm it. 53 fixes, grouped so you can work them like a checklist.

Security headers

9
highApp server (CORS)~15 min
CORS: never pair a wildcard with credentials

Bind credentials to a named origin instead of a wildcard so no other site can make authenticated reads

mediumNetlify headers (netlify.toml / _headers)~30 min
CSP: remove 'unsafe-inline' from scripts and kill XSS blast radius

A strong Content-Security-Policy turns a script injection into a non-event

mediumNetlify headers (netlify.toml / _headers)~5 min
HSTS: force https on the first visit, not the second

Strict-Transport-Security closes the window where a first visit gets silently downgraded to http

mediumNetlify headers (netlify.toml / _headers)~5 min
Clickjacking: block other sites from loading yours in a hidden frame

A one-line frame-ancestors directive tells browsers no other site may embed your pages

mediumApp server (CORS)~15 min
CORS: echo one trusted origin, never whatever asks

Check every Origin against a server-side allowlist so only sites you trust can read your API responses

lowNetlify headers~2 min
X-XSS-Protection: turn the legacy header OFF

The old anti-XSS header now introduces bugs, set it to 0

lowNetlify headers (netlify.toml / _headers)~3 min
X-Content-Type-Options: stop the browser from guessing a file's type

One nosniff header makes browsers honor the content type you declared instead of second-guessing it

lowNetlify headers (netlify.toml / _headers)~3 min
Referrer-Policy: stop leaking full page URLs to third parties

One Referrer-Policy header keeps your page paths and query strings from leaking to other sites

lowNetlify headers (netlify.toml / _headers)~3 min
Permissions-Policy: switch off the camera, mic, and location you never use

One Permissions-Policy header denies camera, microphone, and geolocation to your page and everything it embeds

HTTPS & TLS

9
criticalTLS certificate~10 min
Expired TLS certificate: renew now, then automate so it never lapses again

Renewing the certificate clears the browser's 'not secure' interstitial immediately, and auto-renewal keeps it gone

highWeb server / host (TLS + redirect)~15 min
HTTPS: encrypt every request, and redirect the ones that aren't

Serve all traffic over TLS and 301-redirect http to https so nothing a visitor sends travels in the clear

highTLS / web server config~15 min
Weak TLS versions: turn off TLS 1.0 and 1.1, require 1.2 and 1.3

Dropping the obsolete protocol versions removes the known downgrade and decryption attacks

highTLS certificate~20 min
Self-signed certificate: swap in a publicly trusted one and drop the warning

Replacing a self-signed certificate with a CA-issued one clears the browser's trust warning for every visitor

highTLS certificate~15 min
TLS hostname mismatch: one certificate that covers your apex and your www

Reissuing the certificate so its SAN lists every hostname you serve restores the secure connection

highHTML forms~10 min
Insecure form action: submit over https, never cleartext http

Serve the page and its form over https so nothing a visitor types is sent in cleartext

mediumPage templates + headers~10 min
Mixed content: move every subresource to https and keep the padlock

Switching http subresources to https, with an upgrade-insecure-requests backstop, restores the padlock and stops browsers blocking half your page

mediumTLS certificate~5 min
TLS certificate expiring soon: let it renew itself before the deadline

Automated renewal plus expiry alerts refresh the certificate well before it can ever lapse

infoDNS · CAA~3 min
CAA: control which CAs can issue certificates for you

Lock certificate issuance to your CA and no one else

Cookies & sessions

3

Email authentication

3

Exposed files & secrets

19
criticalDeploy config / web server~10 min
Exposed .git: take your source code back off the public internet

Blocking /.git and rotating any committed secrets stops anyone from downloading and rebuilding your entire codebase

criticalDeploy config + secret rotation~10 min
Exposed .env: rotate the secrets, then get the file off the web

Rotating every credential in a public .env and removing it from the web root closes a direct line to your database and APIs

criticalDeploy config / web server~15 min
Exposed database dump: pull the .sql file and treat the data as out

Removing a public .sql dump and moving backups off the web server stops anyone from downloading a full copy of your database

criticalDeploy config / web server~10 min
Exposed backup archive: delete the .zip and move backups off the web

Deleting a public site archive and rotating any secrets inside it stops attackers from downloading your whole site in one file

criticalWeb server + DB credential rotation~10 min
Exposed wp-config backup: rotate the DB login and clear the salts

Rotating your WordPress database credentials and salts, then removing the backup, closes a direct path into your site's data

criticalDeploy config + AWS key rotation~15 min
Exposed AWS credentials: revoke the keys before anything else

Revoking and rotating leaked AWS access keys, then removing the file, cuts off access to your cloud account and your bill

criticalApp server (actuator) config~10 min
Exposed Spring actuator /env: lock the endpoint and rotate what it showed

Securing the Spring Boot actuator and rotating any secrets it printed stops your live app config from being read by anyone

criticalDeploy config + token rotation~10 min
Exposed .npmrc: revoke the token before it publishes for someone else

Revoking the leaked npm auth token and removing the .npmrc keeps anyone from publishing packages or reading private ones as you

highBuild / source + secret rotation~10 min
Secret in page source: rotate the burned key, then move it server-side

Rotate the exposed key and serve secrets only from the server so nothing sensitive ships to the browser

highWeb server config + password reset~10 min
Exposed .htpasswd: reset the logins and stop serving the hash file

Resetting the accounts in a leaked .htpasswd and blocking the file keeps offline-cracked passwords from unlocking what they guarded

highDeploy config / web server~10 min
Exposed .svn: keep your source history off the public web

Blocking /.svn and deploying build artifacts stops anyone from reconstructing your source, secrets included.

highApp source / web server~5 min
Exposed phpinfo(): delete the page that maps your whole server

Deleting the phpinfo page removes a full, public readout of your PHP and server configuration.

highDeploy config / web server~10 min
Exposed docker-compose.yml: get your infrastructure map off the web root

Removing a web-served compose file stops it handing out your service layout and any inline secrets.

highDeploy config + secret rotation~10 min
Exposed config file: rotate the secrets, then move them off the web

Rotating leaked secrets and moving config out of the web root closes a plain-text path to your credentials.

mediumWeb server config~5 min
Exposed server-status: take Apache's live traffic view off the public web

Restricting mod_status to localhost stops the public watching your live requests and visitor IPs.

mediumApp server / gateway config~10 min
Exposed API docs: stop publishing the map of every endpoint

Gating Swagger/OpenAPI behind auth (or turning it off in production) removes a complete map of your API.

lowClient config + provider console~5 min
Public API keys: lock down the key that's visible in your page

A browser API key is safe to expose only if it's restricted by domain, scope, and quota, otherwise someone else spends your budget

lowApp server / gateway config~10 min
Exposed /metrics: bind Prometheus metrics to your internal network

Binding /metrics to an internal interface stops the public reading your routes, hostnames, and traffic.

lowDeploy config / web server~5 min
Exposed .DS_Store: stop shipping Finder's file list to strangers

Keeping .DS_Store out of your deploy stops anyone from reading the filenames in your folders.

DNS, app & hygiene

10
highApp routing~15 min
Open redirect: only ever redirect to paths you control

Validate redirect targets as internal paths so your domain can't be used to bounce visitors to phishing

highDNS + host provider~15 min
Subdomain takeover: close the dangling record before someone claims it

Remove the dangling DNS record or reclaim the service before an attacker hosts content on your subdomain

mediumFrontend dependencies~15 min
Outdated library: update the known-vulnerable version, then automate the next one

Upgrade the flagged front-end library to a patched release and automate updates so you never drift back

mediumWeb server config~5 min
Directory listing: stop serving a public index of your files

Turning off auto-indexing stops the web server from handing visitors a browsable list of every file in a folder

mediumApp server config~10 min
Verbose errors: hide stack traces behind a clean error page

Returning generic error pages in production stops your app from printing internal paths, queries, and versions to visitors

lowHTML (script / link tags)~10 min
Subresource Integrity: pin third-party scripts so a hacked CDN can't hijack your page

An integrity hash makes the browser verify every third-party script before running it, so a compromised CDN gets blocked instead of executed

infoStatic file · /.well-known/~3 min
security.txt: give researchers a way to reach you

Publish a security contact before you need one

infoWeb server config~5 min
Server banner: stop advertising your exact software version

Suppressing the Server version string takes your site off the easy-target list for automated exploit scans

infoApp framework / headers~3 min
X-Powered-By: remove the header that names your framework

Dropping X-Powered-By stops your responses from telling attackers which framework and version to exploit

infoAuth surface / headers~15 min
Login forms: harden the page attackers try first

A discovered login isn't a flaw; leaving it without rate-limiting, MFA, and secure cookies is