NinjaFirewall review - 5,406 attacks blocked in five months

NinjaFirewall Review: The Only Free Firewall That Runs Before WordPress

Short answer: NinjaFirewall is the most genuinely protective free security plugin I’ve tested, it adds nothing at all to the page your visitors download, and it costs you about 22 milliseconds per request plus a real amount of fiddling. If you want a security plugin with a friendly dashboard that scans for malware and holds your hand, this is the wrong one. If you want the actual firewall part done properly, nothing else free comes close.

Here’s the thing that makes it different, and it’s the whole review in one sentence: NinjaFirewall runs before WordPress starts. Not first among your plugins. Before WordPress. By the time a malicious request reaches the code that would normally boot up your site, NinjaFirewall has already looked at it and thrown it away.

That claim gets repeated a lot in this category without anyone checking it. So I checked it, and I’ll show you exactly how further down.

I’m also not reviewing this from the outside. NinjaFirewall 4.9 has been the firewall on this site since 4 April 2026, running in its strongest mode. In those five months it blocked 5,406 requests from 1,015 different IP addresses. Those are counted from this site’s own log files, and I’ll break them down.

NinjaFirewall WP Edition version 4.9 on the WordPress plugins screen showing the Upgrade to Premium link

How I tested this

I installed the plugin on a clean local WordPress site and measured it against a baseline I’d recorded on two earlier runs, restored, and proved before I started. After I finished I uninstalled it and proved the baseline again, so I know nothing drifted underneath the numbers.

PluginNinjaFirewall (WP Edition) 4.9
AuthorThe Ninja Technologies Network (NinTechNet)
Last updated16 August 2026
In the WordPress repo since30 March 2013
RequiresWordPress 4.9+, PHP 7.1+
Tested up to7.1, the current release
Measured on7 September 2026, WordPress 7.1, PHP 8.3.33, nginx
ThemeKadence 1.4.5, unchanged across every run
Other plugins activeKadence Blocks only, unchanged

Two of those lines are worth pausing on. Thirteen years in the plugin directory is a long time for a security tool, and “tested up to 7.1” means the author keeps up with WordPress releases. When I reviewed SEO Simple Pack last week it was sitting two releases behind, which told me something real about its pace. This one isn’t.

The community signals point the same way. NinjaFirewall has 100,000 active installs and 220 ratings averaging 4.9 stars, and 6 of the 10 support threads from the last two months are marked resolved. For comparison, the last plugin I reviewed had 14 ratings and 0 of 2 threads resolved.

What a firewall plugin actually does

If you’re new to this, the word “firewall” gets used for two different jobs and the difference matters here.

The first job is scanning: checking your files for malware that’s already on your site. The second job is filtering: reading every request that arrives and refusing the dangerous ones before they touch anything.

NinjaFirewall only does the second job. There’s no malware scanner in it. That’s a deliberate choice by the author, who sells a separate scanner, and I’ll come back to whether that’s a fair deal.

It also has two modes, and every review I read skips this entirely. In WordPress WAF mode it loads as one of the first things WordPress runs. In Full WAF mode it loads before WordPress runs at all. Same plugin, very different amount of protection, and the second one takes three clicks to switch on.

Installing it, and the five minutes that look like failure

Activation is ordinary. You get a dashboard telling you the firewall is on and running in WordPress WAF mode, with a button offering to upgrade you to Full WAF.

NinjaFirewall dashboard after activation showing it is running in WordPress WAF mode with the Activate Full WAF mode button

Clicking that opens a small installer. It asks what web server you’re on and which PHP configuration file your host supports, and it offers to make the change itself. If you don’t know the answer to either question, the honest advice is to ask your host, because picking the wrong one just means it doesn’t work rather than anything breaking.

The NinjaFirewall Full WAF installer asking which HTTP server and PHP initialization file the site uses
The Full WAF installer with Nginx with PHP-FPM selected and the .user.ini option chosen

Now the part that will make you think you broke something. You click Finish Installation, the page reloads, and it says “Oops! Full WAF mode is not enabled yet.”

You didn’t break anything. PHP caches this particular settings file for 5 minutes, so the change genuinely hasn’t taken effect yet. The plugin knows this and shows you a live countdown. Wait it out, reload, and it flips to Full WAF on its own.

The NinjaFirewall dashboard showing the Oops Full WAF mode is not enabled yet notice with a countdown timer

I think this is the single biggest reason people give up on NinjaFirewall at the first hurdle. It looks like a failed install and it isn’t.

The NinjaFirewall dashboard confirming NinjaFirewall is running in Full WAF mode

Does it really run before WordPress? I checked

This is the claim the whole plugin rests on, so I tested it directly rather than trusting the dashboard.

I put a small PHP file at the root of the test site that does nothing except print four values. It doesn’t load WordPress. It doesn’t know WordPress exists. If NinjaFirewall is genuinely running at the PHP level, it will have run before this file did, and it will have left its fingerprint behind.

Here’s what that file printed:

This file is NOT WordPress. It does not load wp-load.php.

NFW_STATUS   = 20
auto_prepend = /var/www/html/wp-content/nfwlog/ninjafirewall.php

NFW_STATUS is NinjaFirewall’s own marker, and it’s set inside a file WordPress had no part in serving. That’s the proof.

A plain PHP page that does not load WordPress printing NFW STATUS 20 and the auto prepend path

Then I attacked that same non-WordPress file with a basic directory traversal. It came back 403 Forbidden, blocked by the firewall, on a file WordPress couldn’t have protected because WordPress never ran.

The NinjaFirewall 403 Forbidden block page shown to a blocked request with its incident number

For context on why this matters: when I tested Wordfence against Solid Security earlier this year, a fresh Wordfence install had none of this in place. Wordfence can do the same trick, but it’s opt-in and you have to go and switch it on. Most people never do.

What NinjaFirewall adds to your site

Every plugin costs you something. Here’s what this one costs, measured against the clean baseline.

BaselineNinjaFirewall, Full WAF
Database tables1919, no change
Front-end page HTML96,990 bytes96,990 bytes, no change
Front-end CSS and JS files1010, no change
Tags added to your page head2525, no change
Scheduled background jobs1619, three added
Autoloaded options165167, two added

Read that top half again, because it’s unusual. Your visitors’ pages are byte-for-byte identical with the firewall on and off. No database tables, no scripts, no stylesheets, no markup. Most security plugins can’t say any of that.

The cost shows up in two other places instead.

Speed. Measuring the time to first byte 41 times in each state, the front end went from 0.0844 seconds to 0.1063 seconds. That’s +21.9 milliseconds, about 26%. In the weaker WordPress WAF mode it’s only about +7 ms. The admin area is also measurably slower, though it bounced around too much between runs for me to quote you a figure honestly.

Whether 22 ms matters to you depends on your site, and if you’re chasing load times generally I’d look at what’s actually making your site slow before blaming a firewall.

Memory on every request. The plugin stores its rule set in a single database option called nfw_rules, and that option is 77,324 bytes and set to load automatically. It holds 275 rule groups made up of 1,187 parts. Every page of your site pulls all 77 KB out of the database, whether it needs them or not.

The three background jobs are a garbage collector, an hourly check for new firewall rules, and a daily email report. The rules check isn’t decorative: during my test session the rule set updated itself from version 20260810.1 to 20260901.2 without me doing anything.

What it blocked on this site in five months

This is the part no other review can give you, because it needs a real site taking real abuse.

I counted the incidents in this site’s own firewall logs on 7 September 2026, by counting log lines that begin with a timestamp. I’m telling you the method because the plugin’s own summary files disagree with the logs and report a lower number. The log is the record.

MonthRequests blocked
April, from the 4th311
May724
June2,513
July930
August793
September, to the 7th135
Total5,406

Those came from 1,015 different IP addresses. The busiest single day was 11 June with 1,366 blocked requests. One single address, 45.88.138.44, accounted for 1,360 of the total on its own, which is a quarter of everything.

And here’s what it was actually stopping:

What was blockedCount
Suspicious bots and scanners1,268
Attempts on the login page1,063
Directory traversal805
Username harvesting via author pages699
Local file inclusion563
Username harvesting via the REST API296
Null byte injection265
Known WordPress vulnerabilities183

This is a small blog that sells nothing. It still gets probed thousands of times a month, and roughly 1,000 of those probes were people trying to guess a password.

Now the number I’m most pleased to have. NinjaFirewall records how long it spent on each request it logged, and across the 4,380 logged requests that carry a timing, the median was 0.00123 seconds. That’s 1.2 milliseconds to inspect a request and throw it away, measured by the firewall itself on five months of real attack traffic.

What works the moment you switch it on

Plenty, and this is where NinjaFirewall is strongest for a beginner. You don’t have to configure a thing for the numbers above to happen. The defaults block bots, traversal attempts, file inclusion, null bytes and the known-vulnerability rule set on their own.

Two defaults are worth knowing about because they surprise people.

The first is that it blocks headless browsers by default. I know this because it blocked mine. The tool I use to take the screenshots for these articles was refused at the login page by the very plugin I was photographing:

[403] [GET] [/wp-login.php] [Suspicious bots/scanners]

That’s the firewall doing its job correctly. But it means uptime monitors, link checkers and automated screenshot services can get blocked too, and the fix is to whitelist their addresses rather than switch the policy off.

The second is that it watches for changes to your important settings and to user accounts. Promote someone to administrator and it notices, logs it, and can email you. It doesn’t block the change, it reports it.

The screens you’ll actually use

There are 10 menu items and you’ll open maybe 3 of them regularly.

Firewall Policies is the real control panel, and it’s dense. Three tabs of toggles covering uploads, cookies, user agents, referrers, IP handling and response headers. Most people should leave this alone.

The NinjaFirewall Firewall Policies screen showing the Basic Policies tab
The NinjaFirewall Advanced Policies tab with the WordPress and PHP option groups

Logs is where you’ll actually spend time, and where the numbers above come from.

The NinjaFirewall Logs screen showing blocked requests with severity and reason

Login Protection is a single small screen that adds a challenge to your login page when it’s under attack. Event Notifications decides what gets emailed to you, and its defaults are chatty enough that you’ll want to trim them.

The NinjaFirewall Login Protection settings screen
The NinjaFirewall Event Notifications screen listing the alert options

Firewall Options and Monitoring hold the on/off switch and a file-change checker respectively.

The NinjaFirewall Firewall Options screen
The NinjaFirewall Monitoring screen with the File Check and File Guard tabs

And then there’s Anti-Malware, which is a menu item leading to a page that says the feature has been removed and you should install a different plugin instead. It’s an advert occupying a permanent slot in the menu.

The NinjaFirewall Anti-Malware page explaining the feature was removed and recommending NinjaScanner

Where the paid wall is

There’s no licence key field in this plugin and no locked settings. The paid product is a completely separate plugin, WP+ Edition, that you install instead of this one.

What the free version ships instead is advertising, and I counted it in the source rather than guessing. There are 14 separate “In the Premium version of NinjaFirewall…” tooltips spread across 9 files, 2 permanently greyed-out dropdown options, a link on the plugins screen, and a full-page advert in the menu that is 9,508 pixels tall with 15 vendor screenshots.

The NinjaFirewall Security Rules screen with the Every 15 minutes Premium option greyed out
The top of the NinjaFirewall WP Plus Edition upgrade page inside the WordPress admin

Two limits are stated in the plugin’s own text, and they’re easy to confuse because they sound alike:

Free WP EditionWP+ Edition
How often it fetches new firewall rulesEvery hourEvery 15 minutes
How often it checks for vulnerable plugins on your site3 times a dayEvery hour

The paid version also adds geolocation blocking, IP and bot access control, rate limiting, antispam, and centralised logging across every site you run it on.

I’ll be straight about my reaction. The free plugin is genuinely generous and the protection is real. It’s also carrying more in-admin advertising than any other free security plugin I’ve installed. Both things are true.

What happens when you uninstall it

I removed it properly, using the command that actually triggers the plugin’s own cleanup routine, and then measured what was left.

Result
Plugin folderRemoved
The loader it installs in mu-pluginsRemoved
Its 3 database optionsRemoved
Its 3 scheduled jobsRemoved
The PHP setting that makes Full WAF workStripped out correctly
The nfwlog folderLeft behind, 26 files, 172 KB

That’s a good result, and better than the reputation this plugin has. You’ll read in most write-ups that NinjaFirewall leaves its PHP configuration behind and breaks your site. On version 4.9, uninstalling properly removes that setting. I watched it happen, and the site went straight back to normal.

What it does leave is the log folder, which still holds every blocked request and every attacker’s IP address. Nothing will ever delete it for you, so delete it yourself once you’ve finished with it.

The real risk people run into isn’t uninstalling, it’s migrating. If you copy your site to a new host and bring that PHP setting with you but leave the log folder behind, PHP will look for a file that isn’t there. That’s where the “500 error after moving hosts” stories come from. The plugin’s own documentation covers the correct migration steps, and it’s worth reading them before you move.

Has NinjaFirewall itself ever been hacked?

A security plugin is also code that can have bugs, so this deserves a straight answer rather than reassurance.

In thirteen years there is one recorded vulnerability. It’s an authenticated PHAR deserialization issue affecting version 4.3.3 and earlier, fixed in 4.3.4. The two databases that track these things disagree on how serious it was: Patchstack scores it 3.8, the US national vulnerability database lists it as CVE-2021-4451 and scores it 6.6.

The Patchstack vulnerability database page for NinjaFirewall showing one patched vulnerability

The gap is explained by the word “authenticated”. Exploiting it required already holding a high-privilege account on the site, which is a large obstacle. Patchstack currently shows nothing outstanding.

One bug in thirteen years, needing an admin account to use, patched. That’s a good record, and the correct response is the same as always: keep your plugins updated and turn on automatic updates.

What it costs

The plugin reviewed here is free, with no functional limits. These are the WP+ Edition prices from the vendor’s own page on 7 September 2026, in US dollars:

SitesPrice per site, per year
1 site or one multisite network$89
2 to 5$73
6 to 15$64
15 or more$56

Two details other reviews get wrong. Renewal costs the same as the first year and there’s no subscription or automatic billing, so an unrenewed licence simply expires rather than surprising you. And the money-back guarantee is 14 days but conditional: it applies if the product is unusable and they can’t fix it, not if you change your mind.

The NinjaFirewall WP Plus Edition pricing page captured on 7 September 2026

One warning if you go looking yourself. The pricing page’s HTML contains a struck-through $89 next to a red $76 from an old promotion, sitting inside a comment that browsers don’t display. It isn’t a live sale. The price is $89.

The malware scanner, NinjaScanner, is sold separately and starts at $29 per site per year, with a free version on WordPress.org. There’s no advertised bundle. If you want firewall and scanning from this vendor, budget for both.

Who should use NinjaFirewall, and who shouldn’t

Use it if you want the strongest free request filtering available for WordPress, you’re comfortable answering one question about your web server during setup, and you’d rather have a firewall that does one job properly than a suite that does five jobs adequately. It’s especially good on cheap shared hosting, because it adds nothing to your pages and no database tables.

Skip it if you want one dashboard that covers malware scanning, login security and traffic in one place, or if the words “.user.ini” made you nervous rather than curious. There’s no shame in that. A security plugin you never configure protects you less than a simpler one you actually understand.

The honest alternative is Wordfence. It scans for malware, which NinjaFirewall doesn’t. It shows you live traffic, which NinjaFirewall doesn’t. It’s friendlier to set up.

It also costs more in database weight and CPU, and its equivalent pre-WordPress protection is switched off until you go and enable it. If you want a comparison of Wordfence against another suite, I’ve tested that pairing separately.

If I had to put it in a sentence: NinjaFirewall is the better firewall, Wordfence is the better product.

Questions people actually ask

Is NinjaFirewall completely free?

The WP Edition reviewed here is free with no crippled features. A separate paid plugin, WP+ Edition, starts at $89 per site per year and adds geolocation blocking, rate limiting, access control and faster rule updates.

Does NinjaFirewall slow down WordPress?

Measurably but slightly. On my test site it added 21.9 ms to the front-end response in its strongest mode, and about 7 ms in the weaker one. It adds zero bytes to the page your visitor downloads. On real traffic it spent a median of 1.2 ms per request it inspected.

What is Full WAF mode?

It’s the mode where the firewall runs before WordPress loads, by hooking into PHP itself rather than into WordPress. It’s stronger, because it protects PHP files WordPress knows nothing about, and it needs one extra step during setup. The weaker WordPress WAF mode works without that step.

Is NinjaFirewall better than Wordfence?

At filtering requests, yes, and its strongest mode is on by default once you complete setup while Wordfence’s equivalent is opt-in. At everything else, Wordfence does more. NinjaFirewall has no malware scanner at all.

Do I need a malware scanner as well?

Yes, and NinjaFirewall doesn’t include one. A firewall stops things getting in; a scanner finds what’s already there. The same vendor sells NinjaScanner separately, with a free version available.

How do I safely uninstall NinjaFirewall?

Delete it from the WordPress plugins screen rather than deleting the folder over FTP, because only the proper removal runs the cleanup that strips out its PHP setting. Afterwards, delete the leftover nfwlog folder yourself.

Will the .user.ini file survive a server migration?

Yes, and that’s the one thing to watch. Copying it to a new host without the log folder it points at, or to a host with different file paths, leaves PHP looking for a file that doesn’t exist. Follow the vendor’s migration steps when you move.

Similar Posts