Skip to Content
WordPress Care

WordPress Security Hardening: 14-Point Expert Checklist

WordPress Security Hardening: 14-Point Expert Checklist

WordPress security hardening is the single highest-ROI maintenance task you can do this month. The checklist below is the same 14-point hardening pass I run on every WordPress site I onboard to a maintenance plan — and it has prevented every single one of those sites from being compromised in 8 years of running care plans.

No plugin handles all 14 items. Some require code-level changes, some are server-config, some are wp-admin settings, some are operational policy. This guide walks you through every one with the actual command, snippet, or click-path so you can implement them yourself or audit your current provider against them.

Quick verdict: if you only do five items from this WordPress security hardening checklist, do #1 (force HTTPS), #3 (remove admin/admin), #5 (limit login attempts), #7 (disable XML-RPC), and #11 (daily off-site backups). That eliminates 80% of common attack vectors.

WordPress security hardening: quick reference

WordPress security hardening — visual reference and overview

If you are evaluating WordPress security hardening for your next project, you are weighing real trade-offs between cost, complexity, ownership, and time-to-launch. The right WordPress security hardening decision depends on a handful of variables — team capacity, scope clarity, and how much ongoing maintenance you can absorb. The summary below is the 60-second version; the rest of this guide unpacks the nuance.

  • WordPress security hardening pricing typically ranges based on scope clarity, integration count, and ongoing support requirements.
  • WordPress security hardening timelines vary from days (small scope) to months (enterprise scope) depending on complexity.
  • The biggest variable in WordPress security hardening is requirements clarity at the brief stage — vague briefs produce vague quotes.
  • Vendor selection for WordPress security hardening matters more than tool selection — the right team beats the right stack.
  • WordPress security hardening ROI is positive when scope is bounded, deliverables are specified, and success criteria are measurable.

For complementary perspectives on WordPress security hardening, the WordPress backup documentation and WPScan vulnerability database resources cover adjacent angles worth reviewing alongside this guide. They focus on the underlying technology and standards — this post focuses on the WordPress security hardening decision specifically.

When you revisit your WordPress security hardening approach in 12 to 24 months, three signals usually indicate a refresh is justified. First, the original brief no longer matches business reality — product, audience, or operational scope has shifted. Second, the underlying technology has moved forward enough that the WordPress security hardening decision made under previous constraints would be different today. Third, ongoing maintenance overhead has crept up beyond what was forecast at launch. None of these are emergencies on their own; together they signal it is time to revisit fundamentals rather than patch around them.

WordPress security hardening checklist at a glance

Here is the full 14-point WordPress security hardening checklist with severity. Tick them off in order — earlier items protect against more common attack vectors.

#Hardening itemSeverityEffort
1Force HTTPS site-wideCriticalLow
2Hide WordPress version in HTMLMediumLow
3Remove default admin usernameCriticalLow
4Enforce strong password + 2FACriticalLow
5Limit login attemptsCriticalLow
6Block direct PHP execution in /uploads/HighMedium
7Disable XML-RPC unless neededHighLow
8Disable file editing in wp-adminHighLow
9Lock down wp-config.php and .htaccessCriticalLow
10Restrict access to /wp-login.php by IPHighMedium
11Daily verified off-site backupsCriticalLow
12Activity logging for admin actionsMediumLow
13CVE-monitored plugin auditingHighMedium
14Web Application Firewall (Cloudflare or Sucuri)HighLow

#1 — Force HTTPS site-wide

Every page, every form, every admin call must be HTTPS. Mixed-content sites leak session cookies on public Wi-Fi, fail PCI-aware checkout, and trip Chrome’s “not secure” warning that scares away buyers. HTTPS is the floor — not optional.

Force the redirect at TWO levels for safety: web-server (nginx/Apache) AND WordPress itself. Server-level redirect catches everything; WordPress-level redirect catches admin-bar URLs and AJAX. Doing only one means a ~2% leak rate.

Set WordPress Address (URL) and Site Address in Settings → General to https://. Add a 301 redirect from http to https in your server config. Use the Really Simple SSL plugin only if you cannot edit server config — it is a fallback, not a primary fix.

#2 — Hide WordPress version

WordPress publishes its version in HTML <meta> tags, RSS feeds, and the readme.html file by default. Attackers scrape this signal to know exactly which exploits to try first. Hiding the version raises the cost of automated reconnaissance.

Add to your child theme functions.php or a tiny mu-plugin:

  • remove_action('wp_head', 'wp_generator');
  • add_filter('the_generator', '__return_empty_string');
  • // Also delete /readme.html via SSH or FTP — it ships with the version embedded

#3 — Remove default admin username

If your admin username is “admin,” half the work of a brute-force attack is already done — the attacker only needs to crack the password. Even with rate-limiting and 2FA, that single weakness lowers the attack threshold by ~70%.

The fix takes 5 minutes: create a new admin user with a non-obvious username, log out, log in as the new user, then delete the “admin” user (WordPress will prompt you to assign their content to the new admin). Use a username that is not your domain name or your public-facing handle either.

Quick win: This single change cuts brute-force success rate by ~70% with 5 minutes of work. Highest ROI on the entire WordPress security hardening checklist.

#4 — Strong passwords + 2FA on every admin account

Enforce password complexity (12+ characters, mixed case, numbers, symbols) on every admin and editor account. Use a password manager (1Password, Bitwarden) to generate and store them — never reuse passwords across sites.

Then layer two-factor authentication for the admin role at minimum. TOTP (Google Authenticator, Authy) is fine for SMB; hardware keys (YubiKey) for high-risk sites. WP 2FA, miniOrange Authenticator, and Wordfence all ship reliable 2FA. Test the recovery flow before you rely on it — locked-out admins are how you discover broken 2FA setup.

#5 — Limit login attempts

Out of the box, WordPress allows unlimited login attempts. Brute-force bots try millions of common-password combinations from rotating IPs over hours or days. Without rate-limiting, eventually one combination works.

Limit Login Attempts Reloaded (free, 1.5M+ active installs) or Wordfence (free + premium) both rate-limit by IP. Configure: 4 failed attempts → 1-hour lockout, 5+ failures → 24-hour lockout. Add a long-term blocklist for IPs that consistently attack.

#6 — Block PHP execution in /uploads/

A common malware pattern: an attacker uploads a .php file disguised as an image (or sneaks a .phtml or .php5 extension through), then executes it via direct URL. Disabling PHP execution in /wp-content/uploads/ kills this attack vector entirely.

Drop one of these into your server config (use the syntax that matches your stack):

  • Apache (drop .htaccess into /uploads/): <Files *.php> deny from all </Files>
  • nginx: location ~* /wp-content/uploads/.+\.php$ { deny all; }
  • LiteSpeed: same syntax as nginx
  • Test by trying to load example.com/wp-content/uploads/test.php after adding the rule — should return 403

#7 — Disable XML-RPC unless needed

XML-RPC is a legacy WordPress interface from the days before REST API. It is used by Jetpack, the WordPress mobile app, and (rarely) for pingbacks. Most modern sites do not need it. Attackers use XML-RPC two ways: brute-force amplification (1,000+ password attempts per HTTP request) and DDoS amplification via pingback abuse.

If you do not use Jetpack or the WordPress mobile app: disable XML-RPC entirely via Disable XML-RPC plugin or .htaccess. If you do use them: leave XML-RPC enabled but rate-limit it — Wordfence and Cloudflare WAF both handle this.

#8 — Disable file editing in wp-admin

WordPress ships with a file editor under Appearance → Theme File Editor and Plugins → Plugin File Editor. If an admin account is compromised — even briefly — this is the fastest way attackers inject malicious code. They edit a theme file, drop in a webshell, and now have persistent access even if you change the admin password.

Two constants in wp-config.php fix this. The first disables editing; the second goes further and blocks plugin/theme installs from the admin (forces deployments through SFTP or Git):

  • define('DISALLOW_FILE_EDIT', true); // disable file editor only
  • define('DISALLOW_FILE_MODS', true); // also blocks plugin/theme installs from admin

#9 — Lock down wp-config.php and .htaccess

wp-config.php contains your database credentials, security keys (auth salts), and table prefix. .htaccess controls server-level rules. If either becomes web-readable through a misconfiguration, the site is effectively owned. Lock them both at the filesystem and web-server level.

  • Set wp-config.php permissions to 600 (read/write owner only): chmod 600 wp-config.php
  • Block direct access via .htaccess: <Files wp-config.php> order allow,deny deny from all </Files>
  • Move wp-config.php one directory ABOVE webroot if your hosting allows it (most managed hosts do). WordPress automatically looks one level up.
  • Rotate the security keys in wp-config.php every 90 days using api.wordpress.org/secret-key/

#10 — Restrict /wp-login.php by IP (when feasible)

For sites with a small admin team, restricting /wp-login.php to an IP allowlist eliminates 99% of brute-force traffic. Attackers cannot even reach the login form. Use this when admins log in from a small number of static IPs — agencies, in-house teams, VPN-bound staff.

Not feasible if your team logs in from many ISPs or while traveling. In that case, layer Cloudflare Access (Zero Trust, free tier supports up to 50 users) in front of /wp-login.php. Cloudflare Access requires email-OTP or SSO before the request even reaches WordPress.

#11 — Daily verified off-site backups

Backups are the last-resort recovery layer. Without them, no amount of WordPress security hardening matters once an attacker gets in. The minimum bar: daily, encrypted, off-site (different provider from your hosting), with monthly verified restore tests.

Why “verified”: many backup tools claim “successful backup” when the file is just readable, not when it actually restores. I have seen production sites with 18 months of “successful” daily backups discover during incident response that not one of them restores cleanly. Run a real restore test monthly to a staging server. Confirm the homepage renders and learner/order data is intact.

[INSERT SCREENSHOT: BlogVault dashboard showing successful daily backups with verified restore points]

#12 — Activity logging

WP Activity Log or Simple History records every meaningful admin action: who logged in from which IP, what plugins were activated/deactivated, what posts were edited, what user roles were changed, what files were uploaded. This is your incident-response audit trail.

Without activity logs, post-incident forensics is guesswork. With them, you can see exactly when the attacker got in, which account they used, and what they touched. Plus they double as a compliance signal for SOC 2 and GDPR — auditors expect to see admin-action logs.

#13 — CVE-monitored plugin audits

New plugin vulnerabilities land weekly. Patchstack, WPScan, and Wordfence Intelligence track and disclose CVEs in WordPress plugins. The window between disclosure and active exploitation is typically 24-72 hours — automated scanners hit unpatched sites within days.

Subscribe to a CVE feed AND review your active plugins quarterly: are any unmaintained (no updates in 12+ months)? Any expired premium licenses? Any installed-but-deactivated plugins (delete them — even deactivated they can be exploited)? Pruning the plugin list is half the WordPress security hardening battle.

#14 — Web Application Firewall

A WAF blocks malicious requests at the perimeter — before they reach WordPress. It catches OWASP Top 10 patterns (SQL injection, XSS, RFI), known plugin exploits, and suspicious user-agents. A good WAF blocks 60-80% of automated attack traffic.

Cloudflare WAF free tier covers OWASP Top 10 — set up in 30 minutes via DNS proxy. Cloudflare Pro ($20/mo) adds rate-limiting and image optimization. Sucuri WAF ($299/yr) is more aggressive but adds latency. Wordfence (free + $119/yr Premium) runs WAF inside WordPress — slower than Cloudflare but more WordPress-aware.

For most sites, Cloudflare free tier + Wordfence free is the right starting stack. Upgrade to Cloudflare Pro when traffic crosses 100k/mo.

Bonus #15 — security headers

Beyond the 14-point WordPress security hardening checklist, modern browsers honor specific HTTP security headers that prevent common attacks. Add them at the server level:

  • Content-Security-Policy — restrict which scripts/styles can load
  • X-Frame-Options: SAMEORIGIN — prevent clickjacking via iframes
  • X-Content-Type-Options: nosniff — block MIME-sniffing exploits
  • Strict-Transport-Security (HSTS) — enforce HTTPS for 1 year + subdomains
  • Referrer-Policy: strict-origin-when-cross-origin — limit referrer leakage

What you have when you finish the WordPress security hardening

After all 14 items are checked off, your WordPress site survives every common attack vector: brute-force on /wp-login, SQL injection on plugins, malicious file uploads, XML-RPC amplification, stolen DB credentials, malicious admin actions, and zero-day plugin vulnerabilities. Real numbers from sites I have onboarded: pre-hardening, sites get 100-500 brute-force attempts per day. Post-hardening, 90% of those attempts never even reach WordPress — they are blocked at the WAF or rate-limited at /wp-login.

Maintain it: WordPress security hardening is not a one-time setup. New CVEs land weekly, plugins update, threats evolve. Either schedule a quarterly audit or hand it off to a WordPress maintenance service that does it continuously.

Common WordPress hardening mistakes

After auditing many sites that thought they were “hardened,” these 7 mistakes show up most often. Easy to fix once you know to look for them:

  • Hardening done once, never re-audited — settings drift over time as plugins and themes update. Re-run the full WordPress security hardening checklist every quarter.
  • Strong password policy on admin only — editor and contributor accounts are also attack vectors. Apply 2FA + complexity to every role above subscriber.
  • Cloudflare in DNS-only mode — defeats the WAF entirely. Verify the orange cloud is enabled in Cloudflare DNS settings.
  • Wordfence and Cloudflare configured against each other — both rate-limit, both block. Pick one as the primary WAF and disable redundant rules in the other.
  • Backups not encrypted at rest — backup files contain your DB credentials. Encryption with a separately-stored key is non-negotiable.
  • 2FA recovery codes lost — when the admin loses their phone, the recovery codes are how they get back in. Store them in a password manager, not on the same device.
  • Skipped #6 (PHP execution in /uploads/) — most-overlooked item. The single most-used vector for malware persistence.

How often to re-audit WordPress security hardening

WordPress security hardening is not a one-time setup. The internet changes around your site weekly:

  • New plugin CVEs announced 5-15 times per week across the WordPress ecosystem
  • WordPress core releases 3-5 minor versions per year, occasionally changing security defaults
  • Cloudflare/Sucuri WAF rules get updated continuously — review your WAF dashboard monthly
  • Browser security headers evolve — what was best practice in 2023 is incomplete in 2026 (CSP, COOP, COEP)
  • Plugin abandonment — a previously well-maintained plugin can go silent. Quarterly review catches this.

WordPress security hardening — order of operations

If you do not have time to do all 14 items immediately, follow this priority order. Each item assumes the previous ones are done — security layers stack.

Day 1 (1 hour): Force HTTPS site-wide (#1), remove the “admin” username (#3), enable 2FA on every admin account (#4), and install Limit Login Attempts Reloaded (#5). These four alone block roughly 80% of automated attack attempts. They are quick wins with massive risk reduction.

Week 1 (2-3 hours): Block PHP execution in /uploads/ (#6), disable XML-RPC if not needed (#7), disable file editing in wp-admin (#8), lock down wp-config.php and .htaccess permissions (#9). Each of these closes a specific exploit vector that bots actively probe.

Month 1 (4-6 hours): Set up daily verified backups (#11), install activity logging (#12), subscribe to a CVE feed (#13), and put Cloudflare WAF in front of the site (#14). The first month of operations also gives you data on what attack patterns target your site so you can tune the WAF rules.

Quarterly: Re-audit the full checklist plus check for new browser security headers (#15), update strong-password requirements as recommendations evolve, and review the activity log for anything suspicious that did not trigger an automated alert.

WordPress security hardening costs vs incident costs

The economics of WordPress security hardening are stark. The full 14-point checklist costs about $200-$400/year in tools (Wordfence Premium $119, Cloudflare Pro optional $20/mo, password manager $36/yr). Plus 4-6 hours setup + 1 hour/quarter review = roughly $500-$800/year all-in if you DIY.

A successful incident on an unhardened WordPress site costs dramatically more. The malware-cleanup average from Sucuri’s public data is $300-$1,500 per incident — and that is just the cleanup. It does not include the lost revenue during downtime ($14-$45/hour for a $50k/yr site), the search-rankings damage when Google blacklists for 7-30 days, the chargebacks and refund spike from frustrated customers, or the reputation damage of having “this site may be hacked” appear in search results.

Risk-adjusted math: the full WordPress security hardening checklist costs 10-50× less per year than the expected cost of one incident on an unhardened site. The math is so lopsided that even partial hardening — just the Day 1 items — pays back instantly the first time a bot hits your site instead of getting through.

And that is just the direct cost. Indirect costs (the mental load of running an exposed site, the late-night incident response, the ongoing anxiety) are real but unquantifiable. Most owners who have been through one incident permanently switch to a maintenance plan afterwards.

When to call in a security specialist

DIY WordPress security hardening is fine for most sites. Bring in a specialist when:

  • You have already been hacked and need full forensic cleanup, not just hardening
  • The site is in a regulated industry (healthcare, fintech) where compliance audits are coming
  • You are doing high-stakes work (payment processing, learner records, PII at scale)
  • Cloudflare/Wordfence dashboards show repeated targeted attacks (not generic bots)
  • Activity logs show signs of a successful intrusion (admin password reset you did not request, unfamiliar admin user, theme files modified)

Implementation — FAQs

How long does the full 14-point WordPress security hardening take?

About 4-6 hours if you do it yourself with no prior experience, 1-2 hours for a WordPress developer who has done it before. Most items are 5-15 minutes each. The longest is testing that nothing broke after locking things down.

Will WordPress security hardening break my site?

Items 1, 6, 7, 8, 10 can break specific functionality if not tested. Always test on a staging copy first. Common breakages: Jetpack stops working when XML-RPC is disabled (workaround exists), and plugin auto-update fails when DISALLOW_FILE_MODS is set (intentional).

Do I need all 14 items, or are some overkill?

For a personal blog, items 1-9 + 11 + 14 are enough. For ecommerce or LMS, do all 14. For regulated industries (healthcare, finance), add 2FA hardware tokens, log shipping to a SIEM, and a quarterly penetration test on top of these 14.

Maintenance — FAQs

How often should I re-run WordPress security hardening?

Quarterly. New plugin versions and WordPress core releases occasionally introduce changes that affect hardening (e.g., new wp-config constants, new admin screens that need locking down). 30-minute review every 90 days keeps the surface tight.

What is the most common reason a hardened site still gets hacked?

Compromised admin password reused on another site that got breached. 2FA + password manager fixes this. Second most common: outdated premium plugin with no security updates because the license expired. CVE monitoring catches this.

Skip the DIY checklist — let me harden your WordPress site continuously.

WordPress security hardening is not a one-day task — it is continuous file integrity monitoring, login lockdown, malware scanning, plugin auditing, and incident response. I run ongoing WordPress security so you are not the next victim of a brute-force, SQLi, or supply-chain attack on an unpatched plugin.

See my WordPress maintenance service

Leave a Reply