A hacked website costs far more than prevention.
Average cost of a small business data breach: $120,000β$1.24M (IBM/Ponemon 2024) 60% of small businesses close within 6 months of a cyber attack (US National Cyber Security Alliance) 43% of cyber attacks target small businesses β yet only 14% are prepared (Accenture)
This checklist covers every layer of website security. Use it as your quarterly audit. Check off each item. Fix gaps immediately.
Quick-start: the 5 non-negotiables (do these today)
| # | Action | Why | Time |
|---|---|---|---|
| 1 | Enable HTTPS/SSL (valid certificate, HSTS) | Encrypts all traffic; ranking signal; trust | 15 min |
| 2 | Set up automated daily backups (off-site, tested) | Recovery from hack, error, hardware failure | 30 min |
| 3 | Enforce strong passwords + 2FA on all admin accounts | Stops 99% of credential stuffing/brute force | 10 min |
| 4 | Update everything (CMS, plugins, themes, PHP, server) | Patches known vulnerabilities | 20 min |
| 5 | Install security plugin/firewall (Wordfence, Cloudflare WAF) | Blocks attacks before they reach your site | 15 min |
If you only do these five, youβre ahead of 80% of small businesses.
Complete website security checklist
1. SSL / HTTPS / Transport Security
- Valid SSL/TLS certificate β Letβs Encrypt (free) or paid (DigiCert, Sectigo). Auto-renewal enabled.
- HTTPS enforced site-wide β 301 redirect HTTP β HTTPS. No mixed content.
- HSTS header β
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - Secure cookies β
Secure; HttpOnly; SameSite=Stricton session cookies - TLS 1.2+ only β Disable TLS 1.0, 1.1, SSLv2, SSLv3 on server
- Certificate transparency monitoring β Check for rogue certificates (crt.sh, SSLMate)
Test: SSL Labs Server Test β aim for A+
2. Access Control & Authentication
- Unique admin usernames β Never βadminβ, βadministratorβ, βrootβ, business name
- Strong passwords β 16+ chars, generated/stored in password manager (Bitwarden, 1Password)
- Two-factor authentication (2FA) β Required for all admin/editor accounts (TOTP app, not SMS)
- Limit login attempts β 5 failed = 15-min lockout; notify admin
- Disable XML-RPC (WordPress) β Unless actively used for Jetpack/mobile app
- Restrict admin access by IP β If team works from fixed IPs (
.htaccess, Cloudflare, server config) - Separate accounts per person β No shared logins. Audit quarterly.
- Remove unused accounts β Former employees, contractors, test accounts
- Least privilege principle β Editors edit content; only admins install plugins/update core
3. Core Software Updates (Automate Where Possible)
- CMS core β WordPress, Drupal, Joomla, Ghost, etc. Auto-update minor; test major
- All plugins/extensions/modules β Remove unused. Update weekly.
- Themes β Update parent + child themes. Delete unused themes.
- PHP version β PHP 8.2+ required. 8.0/8.1 EOL. Ask host to upgrade.
- Database β MySQL 8.0+ / MariaDB 10.6+. Update via host.
- Web server β Nginx/Apache/LiteSpeed updated by host (verify)
- Operating system β Host responsibility (ask for patch schedule)
WordPress: Enable auto-updates for plugins/themes in
wp-config.phpor via security plugin.
4. Malware Protection & Scanning
- Active malware scanner β Wordfence (WP), Sucuri, MalCare, Imunify360 (server-level)
- Scheduled scans β Daily quick scan; weekly full scan
- Real-time firewall/WAF β Blocks known attack patterns (SQLi, XSS, RCE, bad bots)
- File integrity monitoring (FIM) β Alerts on core file changes (Wordfence, Tripwire, AIDE)
- Block PHP execution in uploads β
.htaccessor Nginx rule:location ~* /uploads/.*\.php$ { deny all; } - Disable file editing in admin β WordPress:
define('DISALLOW_FILE_EDIT', true); - Quarantine suspicious files β Donβt delete immediately; investigate first
5. Backups & Disaster Recovery
- Automated daily backups β Files + database. Off-site (cloud storage, not same server).
- Retention policy β 30 daily + 12 weekly + 12 monthly minimum
- Test restores quarterly β Restore to staging; verify integrity, functionality
- Backup encryption β Encrypt at rest (AES-256) and in transit (TLS)
- Separate backup credentials β Backup storage uses different auth than server
- One-click restore β Documented, tested procedure. Time-to-restore < 30 min.
- Database-only backup option β For quick content rollbacks
Tools: UpdraftPlus, BlogVault, Jetpack Backup, SnapShooter, host-provided (verify off-site)
6. WordPress-Specific Hardening (if applicable)
- Change default database prefix β
wp_βwpxyz_(during install or via plugin) - Disable XML-RPC β
add_filter('xmlrpc_enabled', '__return_false'); - Disable REST API for non-authenticated β Unless headless/block editor needs it
- Hide WordPress version β
remove_action('wp_head', 'wp_generator'); - Block author enumeration β Prevent
?author=1scans - Limit password reset attempts β Prevent reset abuse
- Secure
wp-config.phpβ Move above web root; restrict permissions (400/440) - Disable plugin/theme install/update via admin β If managed via Git/Composer
- Use security headers plugin β Or configure at server level (see Section 8)
7. Form & Input Security
- CSRF tokens on all forms (nonce in WordPress)
- CAPTCHA/honeypot on contact, login, registration forms
- Input sanitization & validation β Server-side, not just client-side
- File upload restrictions β Whitelist extensions (jpg, png, pdf); max size; scan uploads
- Store uploads outside web root β Or serve via script with auth check
- Rate limiting β Per IP on forms, login, search, API endpoints
8. Security Headers (Configure at Server/CDN Level)
| Header | Value | Purpose |
|---|---|---|
Content-Security-Policy |
default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https:; connect-src 'self' https://api.yoursite.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self' |
Prevents XSS, injection, unauthorized frames |
X-Frame-Options |
DENY |
Prevents clickjacking |
X-Content-Type-Options |
nosniff |
Prevents MIME sniffing |
Referrer-Policy |
strict-origin-when-cross-origin |
Controls referrer leakage |
Permissions-Policy |
camera=(), microphone=(), geolocation=(), payment=() |
Disables unused browser APIs |
Cross-Origin-Opener-Policy |
same-origin |
Isolates browsing context |
Cross-Origin-Resource-Policy |
same-origin |
Protects resources from cross-origin embed |
Test: SecurityHeaders.com β aim for A
9. CDN & Edge Security (Cloudflare, BunnyCDN, CloudFront)
- WAF enabled β OWASP Top 10 rules + managed rulesets
- Bot management β Block known bad bots; challenge suspicious
- Rate limiting β Login, API, search endpoints (e.g., 10 req/min/IP)
- DDoS protection β Automatic mitigation (free tier on Cloudflare)
- SSL/TLS mode β Full (Strict) β encrypts origin β edge β visitor
- Cache purge on deploy β Prevents stale content
- Origin shield β Hide origin IP (Cloudflare: βOrange Cloudβ proxied)
10. Monitoring & Alerting
- Uptime monitoring β 1-min checks; alert on downtime (UptimeRobot, Better Uptime, Pingdom)
- SSL expiry monitoring β Alert 30/14/7 days before expiry
- Malware scan alerts β Email/Slack on detection
- File change alerts β FIM notifications for core files
- Failed login alerts β Brute force detection
- Admin login notifications β Know every admin access
- Backup success/failure alerts β Donβt assume backups ran
- Error rate monitoring β 5xx spikes = attack or breakage
11. Incident Response Plan (Documented, Accessible)
- Contact list β Host support, developer, security consultant, legal
- Isolation procedure β Maintenance mode, block traffic, pull origin from CDN
- Forensic steps β Preserve logs, database, files before cleanup
- Cleanup procedure β Malware scan β remove β verify β patch β restore
- Communication template β Customer notification (if data breach)
- Post-incident review β Root cause, lessons, checklist updates
- Legal/compliance obligations β GDPR, CCPA, HIPAA, PCI-DSS notification timelines
12. Compliance & Privacy (If Applicable)
- Privacy policy β Current, accessible, covers analytics, forms, cookies
- Cookie consent banner β GDPR/ePrivacy compliant (Cookiebot, Complianz, Termly)
- Data processing agreements β With hosts, analytics, email providers
- PCI-DSS β If accepting payments directly (use Stripe/PayPal to avoid scope)
- GDPR/CCPA β Data access/deletion requests process documented
- Accessibility (WCAG 2.1 AA) β Not strictly security, but legal risk
Platform-specific quick reference
WordPress (5-minute hardening)
// wp-config.php additions
define('DISALLOW_FILE_EDIT', true);
define('WP_AUTO_UPDATE_CORE', 'minor');
define('AUTOMATIC_UPDATER_DISABLED', false);
// .htaccess (Apache) or Nginx config
# Block PHP in uploads
<FilesMatch "\.php$">
Order Deny,Allow
Deny from All
</FilesMatch>
# Protect wp-config.php
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
Install: Wordfence (free) β enable firewall, 2FA, login limits, scans Configure: Cloudflare (free) β SSL Full Strict, WAF, Bot Fight Mode, Rate Limiting
Static Sites (Astro, Next.js, Hugo, Jekyll)
- Deploy via Git β No FTP/SFTP credentials on server
- Edge functions β Auth, rate limiting, headers at edge (Vercel, Netlify, Cloudflare Pages)
- Dependency scanning β
npm audit, Snyk, GitHub Dependabot in CI - Content Security Policy β Strict CSP (no
'unsafe-inline'if possible) - Environment variables β Secrets in platform dashboard, never in repo
Custom / Headless / Ecommerce
- API authentication β JWT/OAuth2, short expiry, refresh tokens
- Rate limiting β Per user/IP on all endpoints
- Input validation β Schema validation (Zod, Joi, Pydantic) on every endpoint
- Database security β Parameterized queries only; least-privilege DB user
- Payment security β Never handle raw card data. Use Stripe Elements, PayPal SDK.
- Admin panel β Separate subdomain, IP-restricted, 2FA mandatory
Quarterly security audit checklist
| Area | Check | Tool/Method |
|---|---|---|
| SSL | Grade A+, no expiry < 30 days | SSL Labs, certmonitor |
| Updates | Core, plugins, PHP, DB all current | WP Admin, composer, host panel |
| Backups | Last 3 restores successful; off-site verified | Restore to staging |
| Scans | Malware scan clean; FIM no unexpected changes | Wordfence, Sucuri, Imunify |
| Access | Admin user list reviewed; 2FA on all; no shared creds | User audit |
| Headers | SecurityHeaders.com = A | securityheaders.com |
| CDN/WAF | Rules active; bot logs reviewed; no bypass | Cloudflare dashboard |
| Monitoring | Alerts tested; no silent failures | Trigger test alert |
| Logs | Access/error logs retained 90 days; reviewed | Host/Cloudflare logs |
| Incident plan | Document current; team knows location | Tabletop exercise |
Security budget: what to spend where
| Priority | Investment | Typical Cost |
|---|---|---|
| 1. Hosting with security | Managed host (auto-updates, WAF, backups, PHP 8.2+) | $30β100/mo |
| 2. Cloudflare Pro | WAF, rate limiting, bot management, APO | $20/mo |
| 3. Security plugin (Pro) | Wordfence Premium / MalCare / Sucuri | $100β200/yr |
| 4. Backup service | Off-site, encrypted, tested restores | $50β150/yr |
| 5. Uptime monitoring | 1-min checks, multi-channel alerts | $0β100/yr |
| 6. Professional audit | Annual penetration test / code review | $1,500β5,000 |
Total: ~$600β2,000/year β vs. $120K+ average breach cost.
FAQ: website security for small businesses
How often should I run a security scan?
Daily automatic (quick) + weekly full scan + manual after any update or suspicious activity. Most security plugins handle scheduling.
Do I need a security plugin if my host has a firewall?
Yes. Host firewall (network layer) + application firewall (Wordfence/Cloudflare) = defense in depth. They catch different things.
Whatβs the most common way small business sites get hacked?
- Weak/stolen credentials (no 2FA, password reuse)
- Vulnerable plugins/themes (outdated, nulled/pirated)
- Outdated PHP/CMS (unpatched known exploits)
- Malicious file uploads (no validation, PHP execution enabled)
- Compromised admin device (keylogger, malware)
Can I secure my site without a developer?
Yes, for 80% of this checklist. Hosting, Cloudflare, security plugin, backups, 2FA, updates β all doable via UI. Items needing dev: custom CSP, server config, API security, custom code review.
What should I do if my site is hacked right now?
- Put site in maintenance mode (block all traffic)
- Change all passwords (hosting, CMS, database, FTP, email)
- Scan with multiple tools (Wordfence, Sucuri SiteCheck, MalCare)
- Restore from clean backup (pre-hack date)
- Update everything (core, plugins, PHP)
- Re-scan. Verify clean. Remove maintenance mode.
- Post-incident: audit how they got in; close the gap.
Is a free SSL certificate (Letβs Encrypt) enough?
Yes, for encryption. Paid certificates add: warranty, organization validation (OV/EV), support, longer validity. For most small businesses, Letβs Encrypt + auto-renewal is sufficient.
How do I know if my backups actually work?
Test restore to staging quarterly. Verify: site loads, admin works, content intact, forms submit, no malware. Document time-to-restore. If > 30 min, improve process.
Final recommendation: security is a habit, not a project
Daily: Auto-updates, scans, backups, monitoring alerts
Weekly: Plugin/theme updates, log review, backup verify
Monthly: User audit, SSL check, WAF log review
Quarterly: Full restore test, header audit, incident drill, penetration scan
Annually: Professional audit, compliance review, disaster recovery test
The businesses that get hacked are the ones that βset and forget.β
Need a security audit or ongoing maintenance? Contact TheWebPal for a complete website security assessment, hardening implementation, and monthly maintenance plans. Weβll lock down your site so you can focus on your business.
Related resources
- Shared Hosting vs VPS vs Cloud Hosting
- How Website Speed Affects SEO and Sales
- Top WordPress Plugins & Tools for Faster, More Secure Websites
- The Ultimate Guide to Web Hosting, Website Design & Online Growth for Small Businesses
- Best Web Hosting Services for Small Business Websites in 2026
- How to Fix a Slow WordPress Website
- Website Backup Guide for Business Owners
- SSL Certificate Guide for Beginners
