WordPress security check
The outside half of my WordPress security checklist. Type your site’s address and see what every bot can already see.
This one can’t run in your browser: the address goes to a small scanner on this site, which visits it like a browser would. It only reads, and keeps one log line per scan (time, IP address, site, score) to catch abuse. Plugin names and version numbers (never your address) are looked up in a public vulnerability database.
Not scanned yet
Type an address and press Scan. The rows below fill in as the answers come back.
Checks
- not checked
Is it WordPress?
Fingerprints on the homepage.
- not checked
HTTPS and certificate
Is the site encrypted, and does the certificate check out.
- not checked
Usernames in the REST API
Can anyone list your users at /wp-json/wp/v2/users.
- not checked
Usernames via ?author=
Does /?author=1 lead to a username.
- not checked
XML-RPC
Does xmlrpc.php still answer.
- not checked
Leftover files
Config backups, .env, database dumps, .git, debug.log.
- not checked
Uploads folder listing
Can anyone browse the uploads folder as a file list.
- not checked
Known holes in this WordPress
The visible version, looked up in a vulnerability database.
- not checked
Plugins with known holes
Plugins the homepage loads, and their versions, looked up the same way.
- not checked
Themes with known holes
The active theme (and its parent), looked up the same way.
- not checked
Version on display
Does the page announce which WordPress it runs.
- not checked
Security headers
HSTS, CSP, clickjacking and friends.
- not checked
Server banners
Does the server announce its software and version.
- not checked
PHP version
Is the announced PHP still getting security fixes.
- not checked
WP-Cron
Can anyone trigger wp-cron.php.
What a scan can’t see
Tick them off as you go. The ticks only live in this tab.
Read the whole checklistRead-only checks of what the site shows any visitor. A first pass, not proof of security.
How to use it
- Type your site’s address.
example.comis enough; a path after the domain is ignored, because only the homepage and a few standard WordPress addresses get checked. - Tick the box: it has to be your site, or one you have written permission to test.
- Press Scan. It takes a few seconds and sends at most 32 requests, all of them plain
GETorHEAD. - Fix the red rows first. Each says what was found and what to change, with a link to the part of the checklist that explains why.
- Then go through What a scan can’t see: backups, passwords, updates. That list is most of the real work.
What it does
Most WordPress break-ins are not clever. A bot takes a list of known weak spots and tries it on thousands of sites. This tool asks the questions that bot asks, so you see your site the way it does: are your usernames listed at /wp-json/wp/v2/users, does xmlrpc.php answer, does the page announce which WordPress version it runs, and is that version (or any plugin or theme the page loads) on a list of known vulnerabilities, are backups or a .env lying in the web root, is the uploads folder browsable, is the site on HTTPS with a valid certificate, are the basic security headers set.
It is passive on purpose. It only reads what the site shows any visitor: no logging in, no password guessing, no exploit payloads, no POST to XML-RPC, no downloading of wp-config.php or backups: leftover files are asked about with HEAD, which returns only the headers. A site that passes is not “secure”. It just has no obvious door open to the street.
Why it needs a server when the other tools here don’t: a browser is not allowed to read another site’s response headers, and headers are half of what gets checked. So the address goes to a small scanner on this site. It refuses private and internal addresses, checks every redirect again before following it, stops each scan at 32 requests or 30 seconds, and allows a few scans a minute per visitor, a few per site every ten minutes, and a small number per day in total. Asking about the same site again within five minutes shows the same report instead of scanning it again. Each scan leaves one log line (time, your IP address, the site and the score) so abuse can be spotted; it sits with the server’s other logs, which rotate away. For the vulnerability rows it reads each plugin’s public readme.txt for the installed version, then asks the free WPVulnerability database about that plugin and version; your address is not part of that question.
The score starts at 100 and loses points for what is found: 25 for public usernames or a downloadable backup, .env or config copy, up to 20 for each vulnerable plugin and 15 for a vulnerable core, 10 each for XML-RPC, a browsable uploads folder, a visible version, no HTTPS or a bad certificate, and a few for missing headers and chatty server banners. 85 and up is a good baseline, 65 to 84 needs attention, below that fix the open doors first. The reasoning behind every row, and everything a scan can’t see, is in the WordPress security checklist.
Questions
Why does it say WordPress was not found?
It looks for WordPress fingerprints on the homepage: links into wp-content or wp-includes, the generator tag, the wp-json Link header. A heavily cached page or a “hide WordPress” plugin can remove all of them, and a WordPress installed in a folder like /blog/ is not on the homepage at all. Then nothing else is checked, and the score stays empty instead of pretending.
How do I hide the usernames?
Don’t block all of /wp-json/: the block editor and plenty of plugins need it. Restrict only the users route for visitors who are not logged in. Most security plugins have a switch for it, and the checklist has a short snippet if you’d rather not add a plugin. Scan again afterwards: the row should turn green with a 401, 403 or 404.
What does “unclear” mean?
The site answered with something the check can’t read: a firewall challenge page, an error, a timeout. It doesn’t count for or against you. Firewalls like Cloudflare or Imunify360 often answer scanners differently from browsers, so check that row from your own terminal, for example curl -I https://example.com/xmlrpc.php.
It lists a vulnerability I already fixed.
The version comes from what the site shows: the generator tag or core file links for WordPress, each plugin’s readme.txt or asset links for plugins. A readme left over from an old version, or a caching plugin serving old asset links, can be behind what is installed. Dashboard → Updates has the real versions. Plugins that load nothing on the homepage are invisible here, so check those there too.
Can I scan someone else’s site?
Only with their written permission. The checks read the same public pages a search engine fetches, but scanning a site you don’t look after is still knocking on a stranger’s doors, and the checkbox is there for that reason.