
WordPress runs more than 43% of the web, and its plugin ecosystem is both its greatest strength and its biggest liability. Every plugin you install is third-party code with the same access to your database, your files, and your users that your own theme has. When something goes wrong, it usually isn't WordPress core that's to blame. According to vulnerability databases like Patchstack and WPScan, the overwhelming majority of reported WordPress security issues each year trace back to plugins and themes, not the core software.
Here's the uncomfortable part: most site owners install a plugin the same way they grab an app on their phone. They read the rating, glance at the install count, click activate, and move on. That's how a "harmless" contact form plugin ends up exfiltrating form submissions to a server in another country, or how an abandoned slider plugin becomes the entry point for a full site compromise.
This guide walks through a practical, repeatable WordPress plugin security audit you can run before a plugin ever touches your live site. No advanced security background required. I'll cover the signals that actually matter, a worked example using a real vetting workflow, the tools I rely on, and the mistakes that trip up even experienced admins.
Key Takeaways
- Audit before you install, not after. Vetting a plugin on a staging site costs minutes; cleaning a hacked production site costs days.
- Check four metadata signals first: last update date, active install count, support thread response rate, and WordPress version compatibility.
- Cross-reference the plugin against vulnerability databases like WPScan and Patchstack before activation.
- Read the actual code for risky functions like
eval(),base64_decode(), and unsanitized$_GET/$_POSTusage.- Test in isolation using a staging clone, then monitor outbound connections and file changes.
- Fewer plugins is safer. Every plugin you remove shrinks your attack surface.
Why Plugin Auditing Matters More Than You Think
The math is brutal. A typical WordPress site runs between 20 and 30 plugins. If each plugin has even a small chance of containing a serious vulnerability in any given year, your aggregate risk climbs fast. Run 25 plugins where each carries a 3% annual chance of a critical flaw, and the probability that at least one of them is vulnerable in a year is roughly 1 - (0.97)^25, or about 53%. That's a coin flip, every year, that one of your plugins becomes a liability.
And vulnerabilities aren't the only threat. Plugins can be abandoned, sold to new owners who inject ads or trackers, or quietly bundled with code that phones home. The same caution applies to any third-party code, which is why I always recommend reading our guide on how to verify open source software before you install it alongside this one. The principles overlap heavily.
The cost of getting it wrong
A compromised plugin doesn't just affect you. Google blacklists infected sites, hosts suspend accounts, and customers lose trust the moment a browser flashes a malware warning. Recovery often involves a clean reinstall, database scrubbing, and weeks of reputation repair. Spending fifteen minutes on a pre-install audit is the cheapest insurance you'll ever buy.
Step 1: Vet the Plugin's Metadata and Reputation
Before you download anything, the WordPress.org plugin page (or the vendor's listing) gives you a surprising amount of signal. Treat this as your first filter.
- Check the "Last updated" date. If a plugin hasn't been touched in over 12 months, treat it as a red flag. WordPress even flags plugins not tested with the latest three major releases. Abandoned code rarely gets security patches.
- Look at active installations. A plugin with 200,000+ active installs has thousands of eyes on it. That doesn't make it bulletproof, but bugs get found and fixed faster. Be cautious with plugins under a few thousand installs unless you've personally reviewed the code.
- Read the support forum. Filter to "unresolved" threads. If users are reporting security concerns, conflicts, or "site went down after update" and the developer is silent, walk away.
- Verify the developer's track record. Click through to the author's profile. Do they maintain other plugins? Do they respond to issues? A developer with a five-year history of clean releases is a very different bet than an anonymous one-off account.
- Check the changelog. A healthy changelog mentions security fixes openly. A vendor who hides or never mentions security work is either lucky or not looking.
A worked example
Say you need a gallery plugin. You shortlist three candidates. Plugin A has 90,000 installs, last updated 3 weeks ago, with a developer who answers support threads within 48 hours. Plugin B has 4,000 installs, last updated 14 months ago, with 22 unresolved support threads. Plugin C has 600 installs and no support history at all.
Even before reading a single line of code, your decision is nearly made. Plugin A passes the first filter. Plugin B and C require deep code review to justify, and in most cases the extra risk isn't worth it when a well-maintained alternative exists.
Step 2: Cross-Reference Known Vulnerability Databases
This is the step most people skip, and it's the highest-value one. Several free databases track disclosed WordPress plugin vulnerabilities. Before installing, search the plugin's exact slug.
- WPScan Vulnerability Database (wpscan.com) — searchable by plugin name, lists CVE numbers, affected versions, and patch status.
- Patchstack Database (patchstack.com/database) — community-driven, often faster to publish than official channels.
- CVE / NVD (nvd.nist.gov) — the authoritative government record for assigned CVE identifiers.
- WordPress.org plugin page — sometimes carries a closure notice if a plugin was pulled for a security issue.
Search the plugin name and note two things: whether vulnerabilities exist, and whether they were patched promptly. A plugin with five historical CVEs that were all fixed within a week is arguably safer than one with zero reports and a dead developer. Responsiveness is the metric that matters.
Step 3: Read the Code for Dangerous Patterns
You don't need to be a PHP expert to spot the obvious warning signs. Download the plugin ZIP, extract it, and search the files. On Mac or Linux you can use grep; on Windows, your editor's search-in-files works fine. If you frequently move files between environments for this kind of review, our Windows Symlink Creator Pro makes it easy to mirror plugin folders into a sandbox without copying them around manually.
Functions and patterns to grep for
eval(— executes arbitrary code. Almost never legitimate in a plugin. Treat as a hard stop.base64_decode(— frequently used to hide malicious payloads from casual review. Legitimate uses exist, but obfuscated strings are suspicious.gzinflate(,str_rot13(— common obfuscation wrappers, often paired with the above.$_GET,$_POST,$_REQUESTused directly in queries withoutsanitize_*or prepared statements — a SQL injection waiting to happen.file_get_contents(orcurlcalls to hardcoded external URLs — the plugin may be phoning home or pulling remote code.wp_remote_get(to unfamiliar domains — check where data is being sent.- Missing
nonceverification on form handlers — a CSRF vulnerability.
For paste-and-search workflows where you're checking snippets against known malicious signatures, a private scratchpad tool like LionPaste is handy for storing and comparing code fragments without leaving traces in shared documents.
A quick command-line scan
From inside the extracted plugin folder, run something like:
grep -rn "eval(\|base64_decode(\|gzinflate(\|file_get_contents(http" .
If that returns hits, open each one and understand what it does. Obfuscated blobs of base64 with no comments are the single most reliable indicator of a planted backdoor I've found in years of reviewing plugins.
Step 4: Test in an Isolated Staging Environment
Never activate an unvetted plugin on production. Spin up a staging clone of your site, ideally on a subdomain or local environment, and install the plugin there first.
- Clone your site to staging using your host's tools or a migration plugin. Make sure your data is backed up first; if you don't have automated backups yet, set them up using our walkthrough on automated file backups on Windows and Mac.
- Record a baseline. Note your file structure and database table count before activation.
- Activate the plugin and watch for new database tables, new admin users, new scheduled cron jobs (check
wp_optionsforcronentries), and modified core files. - Monitor outbound connections. Use browser dev tools or a network monitor to see if the plugin contacts external servers on activation or page load. Unexpected calls to unknown domains are a major red flag.
- Test for new files in unexpected places, especially in
wp-content/uploadsor root directories.
If anything surprising happens during this controlled test, you've just saved your production site. Roll back the staging environment and move on to a safer alternative.
Free Tools vs Paid Tools vs Manual Review
There's no single right approach to a plugin audit. Each method trades effort for coverage. Here's how the common options compare.
| Method | Cost | Catches known CVEs | Catches obfuscated malware | Effort | Best for |
|---|---|---|---|---|---|
| Manual code review | Free | Sometimes | Yes, if thorough | High | Small or unknown plugins |
| Vulnerability DB lookup | Free | Yes |








