Halloween sale: up to 50% off any Must-Have plugin.Halloween sale: up to 50% off Every spin of our wheel wins a coupon, until October 31. Spin the wheel

Real-time write firewall for WordPress

Security that runs before WordPress does

Most security plugins find the webshell after it's on disk. Must-Have Security stops it from becoming a file at all. An engine loaded before WordPress judges every write by what it contains, and refuses executable code that nothing on your site was allowed to create. And for what was already there before you installed it, a scanner that proves files harmless instead of guessing.

The write firewall needs no signatures, no cloud Built so it can't lock you out of your own admin
Runs before WordPress
Judged by content, not signatures
Passkeys & scoped write permissions
Every attempt logged with evidence
0-day a brand-new webshell with no signature still has to become a file, and that's the part we watch
3 deterministic write verdicts: ignore, protected, inspect. No network, no AI, no drift
~ms added to a full admin request: about 2–45 µs per file operation, measured on our test hosts
Why signatures lose

A malware scanner reacts. This intercepts.

Signatures describe payloads that have already been seen and are already on disk. The webshell that breaks into your site next has no signature anywhere yet.

Must-Have Security doesn't try to recognise the payload. It watches the one thing every persistent attack has in common. Sooner or later, the code has to become a file. An extension proves nothing, so the engine reads the bytes: a .txt that carries <?php next to eval($_POST[…]) is not documentation. The write is refused before the file exists.

One idea, enforced everywhere

Being an admin isn't permission to write code

Four layers, each judging a different thing, and all following one principle: the ability to modify executable code is a capability WordPress hands out too freely, so this takes it back and lends it out deliberately.

Code control

Acts at the write, before the file exists

Every write is judged by its bytes, uploads included, and executable code needs a permission you opened yourself.

  • Two-stage content detection, every dotted segment checked
  • Scoped write permissions, timed in minutes
  • Trusted admins and their factors kept outside the database
  • Footprint whitelist keyed on content, never on a location

Request firewall

Acts on every request, before WordPress loads

Decides what may be asked for in the first place, and which clients get an answer at all.

  • Direct-request layer: which PHP files may be asked for by name
  • Attack-request classifier, plus optional AI-crawler blocking
  • Country lookup for every event (DB-IP list, on by default, or your CDN's country header)
  • Path decoded and collapsed before matching

Database and cron monitoring

Acts in the background, while the site runs

Watches where an attacker goes when a file write is refused: scheduled tasks and writes into the database.

  • New and changed cron entries reported
  • SQL writes recorded with their payload
  • Findings arrive with the evidence attached
  • Optional daily or weekly e-mail summary

Malware scanner

Acts on schedule, and whenever you ask

For what was already on disk. Core is checked against the official checksums, everything else is read as code.

  • Two passes, everything executable first
  • A classifier proves files harmless, under 1 % reach AI
  • Shared reputation: each file content judged once
  • Flags with the evidence, never deletes on its own

Every layer writes to the same append-only journal: the proposed content, its hash and the caller chain. Blocked payloads are kept under quarantine, so you can allow one once and replay it through the same policy.

Watch it work

See a webshell get refused at the write

A live upload with a payload inside, monitor mode showing exactly what enforce would do, and a scoped permission opening for a real plugin update.

The allow side

Updates work. Injections don't.

Under enforcement, writing PHP needs a scoped write permission, one you open yourself, from the screen you're on. Click "Update plugin", tap your passkey, and a permission for wp-content/plugins/** opens for a few minutes.

A stored XSS firing from the same administrator session, trying to write functions.php? No permission covers themes, so it's refused, even though WordPress considers the session entirely legitimate. Proving a factor never opens a window: every permission costs a fresh tap, so a script has nothing recent to ride on.

Protects from day one, never against you

The one screen it can't lock you out of

A security plugin that bricks the screen where you'd turn it off has failed, whatever it caught on the way. Must-Have Security enforces from the first request, so a webshell is refused on day one, and everything that could stand between you and your admin is built to fail toward letting people in. An address a trusted admin has used is never refused, no firewall rule can block the admin or the login screen, and blocks are timers, not walls.

Prefer to watch first? Switch file writes to monitor mode: every write is evaluated and recorded with its full payload, nothing is blocked, and you see precisely what enforce would do on your real site. WP-CLI runs in monitor mode by default, so command-line deploys keep working while still being recorded.

Built around not failing

The most dangerous line of code on your site, handled with care

Running before WordPress means one broken line takes every URL to a 500, wp-admin included. Nothing else this plugin does can fail that badly, so the loader is shaped entirely around never failing that way.

The method is chosen from the SAPI, not a server banner. Removing a loader is a two-stage retirement, never a delete. The stub is replaced with an inert file that exists and does nothing, because a missing auto_prepend_file is a fatal, not a warning. If the engine itself ever fatals, it switches itself off, lets the site boot and e-mails every trusted administrator. And because "make the engine fail" must never become a way to turn the protection off, that switch is yours to disable, behind a passkey.

Who may write

Find the admin nobody created

An attacker's favourite souvenir is an administrator account. The Admin accounts screen lists every account that can install code or manage other accounts, and says what is wrong with each one: hidden from the Users screen, a password written straight into the database, administrator rights given to the account directly or to a role that should not have them, no registration date, or a login generated by a script.

It shows each account's open sessions and application passwords, and warns when anyone can register into a role with administrator rights. A suspicious account can be demoted or deleted after you confirm with your passkey or code. Your own account, a trusted administrator and the last administrator cannot be removed this way.

What was already there

A scanner that proves files harmless

The write firewall stops what tries to arrive. The scanner is for what arrived before: over FTP, in a plugin that shipped with a backdoor, or as an SVG with a script inside. It runs in two passes: everything that can execute first (PHP in any dotted segment, .htaccess, uploads that shouldn't be there), then every other file for hidden PHP.

Core is verified against the official WordPress checksums. Everything else goes through a classifier that reads PHP as tokens and follows request input through the code: a file with no backdoor mechanism reachable from any input is good, no AI needed; eval($_POST[…]) is bad by rule, whatever anyone says. Only what cannot be decided either way (under 1 % of files on a real site) is judged by AI, and only that leaves your site. It flags, never deletes. You review each finding with the file in front of you.

The webshell never becomes a file.

Not scanned after the fact. Refused at the write, before WordPress even loads.

Get Must-Have Security Now
Monitor mode one click away, if you want to watch before you block
Engineered so it can never lock you out

Simple, Transparent Pricing

Every layer in every plan. It keeps protecting your site even if your subscription lapses.

Single

$59.99 /year
  • 1 website
  • Write firewall & upload gate
  • Malware scanner
  • Passkeys & scoped permissions
  • Request firewall & direct-request layer
  • Evidence journal & quarantine
  • Admin accounts check
  • Updates & support
Purchase

Multi

$159.99 /year
  • 5 websites
  • Write firewall & upload gate
  • Malware scanner
  • Passkeys & scoped permissions
  • Request firewall & direct-request layer
  • Evidence journal & quarantine
  • Admin accounts check
  • Updates & support
Purchase
Best Value

Must-Have Pack

$59.99 /month
  • UNLIMITED websites
  • ALL Must-Have Plugins included
  • Security
  • Backup
  • Analytics
  • Performance
  • Cookie
  • Tweaks
Purchase
14-Day Money-Back Guarantee

Try it risk-free. Not for you? Every cent back, no questions asked.

Frequently Asked Questions

A signature scanner looks for known-bad code that is already on your disk. Must-Have Security first stops the code from being written at all. It runs before WordPress, judges every file write by its content, and refuses executable code that nothing on your site was authorised to create, so a brand-new webshell with no signature anywhere is still refused. It also has a scanner for what was already there, but a different kind: core is verified against the official checksums, and everything else is read as code. A classifier follows request input through the file and either proves it harmless, condemns it by rule, or hands the rare undecidable case to AI. No signature list to be one step behind.

No. When you update a plugin, theme or core, you open a scoped write permission from the screen you're on with one tap of a passkey. It covers exactly that path, for a few minutes. If you would rather watch first, switch file writes to monitor mode and see what enforce would do on your real site before turning it back on.

It is engineered specifically not to. The response layer fails toward letting people in, an address a trusted admin has used is never refused, no firewall rule can block the admin or the login screen, and the loader is retired in two safe stages rather than deleted. If the engine itself ever fatals, it switches itself off, lets the site boot and e-mails every trusted administrator, who re-arms it from the dashboard. (That self-disable is a switch: if you would rather a broken engine mean a 500 than an unprotected site, you can turn it off, behind your passkey, because the other direction is a weakening.)

Each file operation round-trips through PHP userland, which cost about 2–45 microseconds per operation on our test hosts, so a few milliseconds on a full admin request. Hosts differ, so treat these as our measurements, not a promise for yours.

WordPress and PHP with the ability to set auto_prepend_file via .user.ini or .htaccess, which covers almost all shared and managed hosting. Where no loader fits, it falls back to booting after WordPress. It needs no root, no server module and no daemon.

The administrator role lives in the database, which is exactly what an injection can rewrite. So the trusted-admin registry and every credential live outside the database, protected by the engine as its own control files. Being a WordPress admin, even a freshly injected one, is never enough to write executable code.

WordPress moves uploads with move_uploaded_file(), which skips the write wrapper, so the upload gate judges the temp file first, by both its bytes and its name. A JPEG carrying a PHP payload is refused, and so is shell.php.jpg, because every dotted segment of the name is checked.

The write engine is fully deterministic: no network, no database, no AI. The same inputs give the same verdict on every request, and nothing can overturn it. The malware scanner is the one part that talks to a service, and it is off until you turn it on and acknowledge that. Even then it sends as little as possible: core is checked by hash, files already known to the shared reputation database by hash, and of the rest a classifier decides most on your own server. Only files it cannot prove harmless or condemn by rule (under 1 % on a real site) are sent to be judged by AI, over HTTPS, while your secrets (wp-config, .env, keys, backups) are checked on your own server only, and nothing about them is sent. Scanner use is capped per subscription: 3,000 requests and 300 AI reviews an hour. A scan that reaches the request cap pauses and carries on by itself; a file over the AI cap waits its turn.

It stops persistence, not post-exploitation. Code that is already executing in a request can call exec() or unhook the wrapper. This layer stops a payload from becoming a file; it does not contain code that is already running. The documentation names those gaps rather than pretending they're closed.

Yes. The engine keeps enforcing, so your security is never held hostage. An active subscription is required for updates and support. Deactivating cleanly removes the loader, and uninstalling keeps your settings unless you tick "delete all data".

Stop cleaning up webshells. Stop them being written.

Join the WordPress professionals who moved from scanning for the breach to preventing it.

Get Must-Have Security

This website uses cookies to enhance your browsing experience and ensure the site functions properly. By continuing to use this site, you acknowledge and accept our use of cookies.

Accept All Accept Required Only