DEV Community

Bob
Bob

Posted on Originally published at kuajingbase.com

WordPress Security Hardening: A 10-Step Technical Checklist

WordPress powers 40%+ of the web, which also makes it the most heavily targeted CMS by automated attack tools. Most compromises aren't sophisticated — outdated core/plugin versions, weak admin credentials, or nulled plugins with backdoors baked in. Here's a hardening checklist ordered by priority.

  1. Stay current — the cheapest security you'll ever get

Enable core auto-updates in wp-config.php:

php
define( 'WP_AUTO_UPDATE_CORE', true );

Plugin auto-updates can be toggled individually from the dashboard. If you're running custom development or version-pinned plugins, manual update control is safer — auto-updates that break something are harder to debug blind.

  1. Kill the low-hanging brute-force targets

Don't use admin as your username — it's the first string every attack tool tries. Passwords: 16+ characters, generated (not memorized), stored in a password manager. Then layer 2FA on top — Wordfence Login Security or the Two-Factor plugin, ~10 min setup, meaningfully closes the gap even if a password leaks.

  1. HTTPS, no exceptions

Free via Let's Encrypt, one-click on most hosts. After installing: update both WordPress Address and Site Address to https:// in settings, then (once on Cloudflare) enable Always Use HTTPS + Automatic HTTPS Rewrites to kill mixed-content warnings.

  1. One security plugin — not multiple

Overlapping security plugins conflict and tank performance. Pick one:

Wordfence — free tier includes WAF, brute-force protection, malware scanning. Free-tier firewall rules lag 30 days behind premium.
Solid Security (formerly iThemes) — friendlier config UI, DB prefix modification, decent free Site Scanner.
Sucuri — free tier is monitoring/logging only; paid WAF is solid but pricier, better suited to higher-traffic sites.

  1. Rate-limit login attempts

5 failures → 15-30 min IP lockout. Built into Wordfence/Solid Security, or use the lightweight Limit Login Attempts Reloaded standalone.

  1. Move off /wp-admin and /wp-login.php

Doesn't fix root-cause security, but filters out a large volume of automated scanning traffic. WPS Hide Login handles this. Critical: write down your new path immediately, and confirm you have SSH/FTP fallback access before you change it — locking yourself out is a real failure mode here.

  1. Backups — files AND database, both

Database-only backups can't restore themes/media. File-only backups can't restore orders/users. Tiered retention: 7 daily / 4 weekly / 3 monthly. UpdraftPlus free tier handles scheduled pushes to Drive/Dropbox/S3. Even if your host does automatic backups, keep an independent copy elsewhere — don't let both copies live on the same infrastructure.

  1. Cloudflare in front of everything

Free tier gets you CDN, basic DDoS mitigation, DNS. After switching nameservers, enable Bot Fight Mode, Browser Integrity Check, Security Level → Medium+. Cloudflare filters at the network layer before requests hit your server; your security plugin filters at the application layer after. They're complementary, not redundant — you need both.

  1. Delete, don't just deactivate

A deactivated plugin's files still sit on disk. If there's an unpatched vuln in those files, direct path access can still exploit it. Audit periodically: remove anything unused entirely, and flag anything not updated in 2-3 years or marked "untested" with the current WP version for replacement.

Never run nulled plugins/themes — injected backdoors are endemic in these, and they undermine every other item on this list.

  1. WooCommerce-specific additions

Audit admin/shop-manager role assignments periodically. Keep payment plugins (Stripe, PayPal) updated with priority — vulnerabilities here carry higher blast radius. Enable email alerts for orders and admin logins. Watch for anomalous refund patterns as a signal of account compromise.

If you do get compromised: take the frontend offline immediately, restore from the last known-clean backup, rotate all credentials, then audit for unfamiliar PHP files — wp-content/uploads is the most common webshell drop location since it's usually writable and rarely audited.

Full writeup with a cost breakdown table and additional context: [https://kuajingbase.com/en/articles/1cg02jkd-wordpress-security-guide-2026-a-10-step-checklist-to]

Curious what others are running for the login-path change — anyone using firewall rules to restrict /wp-admin to specific IP ranges instead? Seems more robust than obscuring the path.

Top comments (0)