Spam protection your visitors never see. No image grids, no "I'm not a robot" checkbox, no puzzles, nothing to click. Your visitors just hit
Send — while their browser silently solves a tiny cryptographic challenge (proof-of-work) in a few milliseconds. Real humans never notice. Mass-spam bots either fail the challenge or have to burn so much computing power per message that spamming your site stops being worth it.
Every form, out of the box. WordPress logins, registrations and comments, WooCommerce checkout and reviews, and virtually every form plugin — Contact Form 7, Elementor Pro Forms, WPForms, Gravity Forms, Ninja Forms, Fluent Forms, Formidable and dozens more (full list below). One plugin protects all of them, and the most popular builders are detected and configured automatically on activation.
Truly universal — not a list of integrations
Most anti-spam tools protect only the form plugins they ship an integration for. If your builder is not on their list — or you use a hand-coded form, a theme's built-in form, or three different builders on one site — you are on your own.
This plugin works differently: it recognizes submissions by their
signature — the characteristic fields and actions of the request itself — instead of hooking into specific form plugins. That is why it covers
any form:
- Popular builders are recognized automatically: their signatures ship with the plugin and are pre-configured on activation.
- Everything else — custom-coded forms, exotic builders, legacy themes — you teach the spam check yourself in under a minute: turn on direct analysis mode, submit the form once, click save. Done. No code, no waiting for the developer to add your builder.
And because no integration code is involved, nothing breaks when your form builder updates.
In practice that solves two everyday problems:
- Real sites mix. A typical site has comments, a contact form from one builder, a newsletter signup from another, WooCommerce reviews — protecting each with its own anti-spam solution means more plugins, more settings pages, more things that can conflict. Here, one plugin covers the whole site.
- Designers and agencies standardize. If you build sites for clients, you can install the same proven plugin on every project — no matter which form stack the client uses (or switches to later). One tool to know, one place to look when something needs attention.
Why "invisible" wins
Every CAPTCHA interaction costs you real visitors: an extra click here, an unreadable image there, "select all traffic lights" on a phone screen — and the contact request or sale is gone. This plugin flips the deal: instead of making
humans prove themselves, it makes the
device pay. The visitor's browser proves it is a real, JavaScript-running client by doing a moment of invisible computation. Zero friction for people, real costs for bots.
Self-contained and featherweight
Everything runs on your own web server — there is no external service in the loop. That is not just a privacy nicety, it is an operational one:
- Nothing external can fail. No third-party API whose outage, rate limit or latency silently breaks your forms. Your spam protection is exactly as available as your site.
- Nothing external slows you down. No remote scripts, no extra DNS lookups or connections — your PageSpeed and Core Web Vitals stay untouched.
- Tiny footprint. A few kilobytes of JavaScript and lean server code; runs fine on shared hosting, staging environments and even intranets without internet access.
Why not just use ...
- Google reCAPTCHA, hCaptcha or Turnstile? They require an account and API keys, load scripts from external servers (hello, consent banners) and still challenge real users when in doubt. This plugin needs no keys, makes no external requests and never challenges anyone.
- Akismet? Sends the content of every submission to an external service for analysis, and commercial sites need a subscription. Here, everything stays on your own server.
- Honeypot fields and time checks? Modern bots skip honeypots routinely, and browser autofill loves to fill them by accident. Proof-of-work attacks the economics of spam instead of playing hide-and-seek.
And they all share one structural limit: they protect the forms they ship an integration for. This plugin protects the forms
you actually have (see "Truly universal" above).
Key features
- Invisible — zero user interaction, ever
- Protects everything: logins, registrations, comments, WooCommerce, every form builder — even hand-coded custom forms
- No account, no API keys, no external services — install and you are done
- Brute-force protection for logins, with optional Fail2Ban log support
- Adaptive under-attack mode: the challenge automatically gets harder for everyone while a spam wave is running, and relaxes afterwards
- Your choice per site: block spam, deliver it flagged, or just collect it in a spam inbox and watch
- Teach it live: unrecognized custom form? Direct analysis mode adds it with one click, straight from the live page
- Lightweight: a few KB of JavaScript, no render-blocking, no layout shift
- Privacy-friendly by design: no cookies, no sessions, no tracking, no data leaves your server, IP addresses are only stored as hashes — GDPR/DSGVO/RGPD-friendly without a consent banner
- Free
Setup Guide
[vimeo
https://player.vimeo.com/video/905897718]
Works with
WordPress: Login, Registration, Password Reset, Comments
WooCommerce: Checkout, Login, Registration, Password Reset, Comments, Product Reviews
Form and page builders: Elementor Pro Forms, Contact Form 7, Fluent Forms, Jetpack Forms, Divi Forms, WPForms, Forminator, Thrive Architect & Thrive Apprentice, Gravity Forms, Formidable Forms, Mailchimp for WordPress Forms, BuddyPress Registration Form, bbPress Create Topic & Reply Forms, Ultimate Member Forms, wpDiscuz Custom Comments Form, Easy Digital Downloads Forms, Paid Memberships Pro Forms, MemberPress Forms, WP-Members Forms, WP User Frontend Forms, CheckoutWC & Flux Checkout, Ninja Forms, Everest Forms, WS Forms, Quform, Otter Blocks, Typeform, NEX-Forms, Bit Form, Form Maker, Funnelforms, Mailjet, Jotform, Page Builder, Metform, Calculated Fields Form, JetFormBuilder, weForms, Responsive Contact Form Builder, Zoho Forms, Smart Forms, Kali Forms, Happyforms, ApplyOnline, Subscribe Forms, FormCraft, Advanced Forms, CRM Perks Forms, Tripetto, Formstack, BuddyForms, vcita, Easy Form Builder, SimpleForm
Anything not on the list can be added in minutes with the built-in analysis modes — no code required.
5.2.0
- Spam messages now show why they were blocked, plus a health counter for submissions without a proof-of-work stamp.
5.1.1
Security release. Fixes the three reported vulnerabilities and, after a full internal review, several related hardenings across the message-management area.
* Security (SQL injection): admin-defined spam-analysis patterns are now escaped before they are interpolated into the LIKE conditions of the message queries. Closes an authenticated (Editor+) SQL injection via the pattern key/value (CVE-2026-16094, CVE-2026-16146).
* Security (stored XSS): the form "action" value shown on the Spam/Messages admin pages is now JavaScript-escaped inside the inline submit handlers, not only HTML-attribute-escaped, so a quote in a captured action can no longer break out into script (CVE-2026-16145). A second highlighting sink in the detail view that re-decoded escaped values is now built via DOM text nodes, so captured content can never execute there either.
* Security (access control / CSRF): every message action — viewing, moving, deleting (including "delete all") and saving patterns / action lists — now verifies its nonce before acting and requires the manage_options capability. Previously the "delete all" path ran without a verified nonce or capability, and the whole message area was reachable with edit_pages. NOTE: managing captured messages is now limited to administrators.
* Security (log injection): the Fail2Ban integration now strictly sanitises the login name and strips line breaks, so a crafted login can no longer forge log lines / ban arbitrary IPs; it also logs the validated client IP instead of the raw remote address.
* Hardening: consistent unslashing/sanitising of admin-AJAX input; guards against malformed unauthenticated requests that could raise PHP errors on the spam-check path; and, on multisite, the Fail2Ban log path can only be set by super admins (with path-traversal rejected).
5.1
This release brings stronger anti-spam layers to every site, alongside important reliability fixes.
* New: gibberish detection — obvious keyboard-mash and random-string submissions are recognised and filtered, language-neutrally, while legitimate codes (VAT ids, serials, order numbers, product names) are left untouched.
* New: repeat-sender ("echo") lock — once a message is classified as spam, its core values (sender, linked domain, phone, long-text hash) are briefly remembered as one-way hashes with a short lifetime, so the same sender is caught again on any form and any IP. It can be switched off, and its remembered values reset, on the settings page; registered users' and admins' addresses are excluded so an injected spam mail can never lock them out of login or password reset.
* New: an adaptive solve-time re-challenge makes implausibly fast (likely non-browser) solves pay more, without ever hard-blocking a genuine visitor.
* New: form builders you activate AFTER installing the plugin are now covered automatically (previously only builders present at install time were). A one-time notice lets you review and confirm any that were already active but not yet covered — your own custom entries, and anything you removed, are never touched.
* Fix: on a small number of sites, every submission could be flagged as spam. The browser-side puzzle is now resilient — a stray PHP notice, a byte-order mark or a proxy error page in the get_stamp response no longer aborts it, and if the request cannot be made at all it falls back to the token already embedded in the page.
* Fix: a password field without a name attribute could abort the script's setup on some themes/builders; hardened so it can no longer break token injection into Ajax form submissions.
* Fix: the challenge-renew timer is now clamped to a sane minimum, so an empty/zero "Time Window" option can no longer cause rapid background requests to admin-ajax.
* Fix: the invisible token is no longer added to GET forms (e.g. a theme's search box), so searching no longer appends a long "gdpr_pow_token=..." to the URL. POST forms are unaffected and stay protected.
* Compatibility: a third-party script that wraps fetch/XHR before the visitor first interacts is no longer overwritten by the plugin.
* Hardening: after an update the plugin proactively invalidates the PHP OPcache for its own files, reducing the chance of old code running against the new database schema. On some hosts an OPcache flush / PHP-FPM restart may still be needed once — see the FAQ.
5.0
- Major anti-spam hardening against protocol-aware bots: every proof-of-work is now bound to a single-use, HMAC-signed token per submission (replay of one solved challenge no longer works), with a per-token and per-IP usage limit
- Forwarded-For/Client-IP headers are only trusted behind a configurable trusted-proxy list (new option) — closes IP-spoofing of the whitelist
- Adaptive difficulty with an automatic site-wide "under-attack mode" (new option): the puzzle gets harder for everyone while a spam wave is running; no per-visitor data involved
- Proof-of-work now uses the browser's native crypto engine where available (about 10x faster), with a fallback for older browsers and http-only sites
- Faster spam-check path: worker no longer sleeps up to 5 seconds under a spam flood
- Redesigned settings page: status strip, topic tabs, short descriptions with progressive-disclosure help on every option
- Reworked direct analysis mode: persistent guide bar with live coverage instead of stacked popups, entries persist server-side
- Security: password fields are never stored in captured submissions — neither in the classic analysis inbox nor in direct-analysis entries
- Security: CSRF protection (nonce) added to the direct-analysis pattern-save endpoint
- Security: SQL statements consistently use prepared placeholders; full WordPress coding-standards pass across the whole codebase
- Recognition patterns can no longer accidentally match on the plugin's own injected fields
- All option texts are now translatable via the WordPress.org community catalog (translate.wordpress.org)
- Requires PHP 7.1 or newer (was effectively required before, now declared honestly)
4.1.2
4.1.1
- Improved Pattern recognition
- Solved: Warning for usage of empty keys
4.1
- Fail2Ban-Support added
- Problems with Thrive Comments and json-based submissions fixed
4.0
- The automatic mode has been removed. From now on, all form types require manual configuration of associated patterns and actions to ensure the spam protection functions correctly.
- During plugin installation, the appropriate actions and patterns for major form builders will be automatically added to the scope—provided the respective form builder is installed.
- Adding new form types to the spam protection, which are not yet included by default, can still be done via the analysis mode or direct analysis mode.
- If important patterns or actions are missing, I appreciate any feedback and suggestions for improvements.
- This update ensures targeted spam protection configuration while still allowing automatic detection of widely used form builders.
3.8.1
- Fixed: Erroneous error handling for file-uploads (i.e. Fancy Product Designer)
3.8
- Fixed: Problems with IP-Forwarding and load-balancing led to always false-positives
3.7.3
- SQL-Bug during installation routine fixed
3.7.2
- Optimized symbols in the settings menu
3.7.1
- Fixed: Bug with empty field "Skip fields from saving"
3.7
- Highly recommended security feature "Skip fields from saving" on the tab "Saving Messages" on the plugins options page added. This feature is intended to exclude fields (i.e. password fields) from beeing saved with messages. Background: The plugin is identifying password fields on the form and skips them from beeing saved already. But in the case of the event that JavaScript is crashing, the identification process may fail and thus the password will be saved nevertheless. Therefore this option shall be used to define password fields manually that shall be skipped from saving.
3.6.10
- Fixed: Bug with hiding the menu in initial state of the settings menu
3.6.9
- Fixed: Bug with the new feature to stop logging logins
3.6.8
- New feature: The admin area is turned to red as long as the simulation mode is on
- New feature: The messages inbox can be hidden, by setting its position to -1
- New feature: The logging of login-messages can be switched off
3.6.7
- Fixed: Variables that where not initialized caused warnings on higher debug-levels
3.6.6
- Problem with forminator and possibly other form builders too fixed: Bots where able to bypassed the pattern matching and thus the spam check too.
3.6.5
- Fixed: A dedicated spam-check for WordPRess-standard-requests was introduced, in order to treat them differently from other post-requests. It turned out that some spam showed up after the last release. This should not happen anymore
3.6.4
- Fixed: In v.3.5.5 the plugin was changed to apply the spam check always on WordPress standard submissions such as comments. Even in explicit mode. This behaviour is changed now, in a way that even for WordPress standard submission types patterns have to match, before they are checked for spam.
- This means: If you are using WordPress standard submission-types such as comments and posts, from now on you need to add the respective patterns for them, as for any other type of submission, in order to make the spam check work for them.
3.6.3
3.6.2
- Improved performance administration area and inboxes
- Bug with empty pages for inboxes solved
3.6.1
- Loading error for Direct Analysis Mode fixed
3.6
- "Direct analysis mode" introduced: This mode allows easier administration of the explicit mode, as froms and submission-types now now can be added directly and life from the forms
- Settings page devided into tabs