Looking for an overview? Visit the Plugin landing page for features, pricing, and install steps. This page is the technical reference.
WordPress Plugin — ReportedIP Hive (Full Edition)
ReportedIP Hive is a community-powered WordPress security plugin. It turns every protected site into a sensor: when one site is attacked, the hive learns and every other site can refuse the attacker before the first request lands. Real-time threat intelligence, sixteen attack sensors including a Web Application Firewall, four-method 2FA, progressive block escalation and server-delivered, signed firewall rulesets. Open source, published under GPLv2+ on GitHub.
vX.Y.Z.
Installation
Download the Plugin
Grab the latest reportedip-hive.zip from the GitHub Releases page, or download it from your Dashboard.
Install & Activate
Go to Plugins → Add New → Upload Plugin in your WordPress admin, select the ZIP file, click Install Now, then Activate.
Run the Setup Wizard
After activation the ten-step setup wizard launches automatically. It walks you through the operating mode, the API key, brute-force thresholds, the firewall (WAF, verified-bot action, disposable-email mode, comment honeypot), the 2FA roster, retention rules, the hide-login slug and the optional auto-footer.
Stay Updated
The built-in update checker (Plugin Update Checker v5.6+) polls GitHub Releases every 12 hours. New versions appear in the WordPress Plugins screen like any other plugin update — no manual reinstall needed. Pinned tag format: vX.Y.Z.
Setup Wizard (10 steps)
The wizard runs on first activation and can be re-launched any time from the plugin settings. Each step persists immediately server-side on every navigation (Back included), so you can stop and resume without losing a setting.
| Step | What it configures |
|---|---|
| 1. Welcome | Intro, link to the docs and optional one-click import of an existing JSON settings export. |
| 2. Connect | Operating mode (Local Shield / Community Network), API key with live validation against reportedip.com. How to create a key is covered in the Authentication docs. |
| 3. Protection | Login / comment-spam / XMLRPC / 404-scan / REST-burst thresholds and timeframes, report-only toggle, block-duration strategy (fixed length vs. progressive ladder). |
| 4. Firewall | Web Application Firewall (enable / report-only), verified-bot action (flag or block spoofers), disposable-email mode (off / monitor / block) and the comment honeypot — all with safe defaults. |
| 5. 2FA | Enable / disable each of the four methods (TOTP, Email, SMS, WebAuthn), enforce roles, grace days, trusted-device expiry. |
| 6. Privacy | Data retention, auto-anonymisation, log level, detailed-logging toggle. |
| 7. Notifications | Recipients (comma-separated, validated via is_email()), From-Name / From-Email for transactional mail, optional sync of the contact list back to the reportedip.com account. |
| 8. Login | Hide-login URL slug (3–50 chars, blacklisted slugs rejected), response mode for the old /wp-login.php (block page or 404). |
| 9. Promote | Optional auto-footer banner, variant (badge / shield / banner / stat) and alignment. |
| 10. Done | Completion summary, link to the dashboard. |
Operating Modes
Two modes — switch between them at any time without losing local data.
| Feature | Local Shield | Community Network |
|---|---|---|
| All sixteen attack sensors | Yes | Yes |
| 4-method 2FA + trusted devices + recovery codes | Yes | Yes |
| Progressive block escalation | Yes | Yes |
| Hide-login URL | Yes | Yes |
| IP reputation lookups against the hive | No | Yes (via API) |
| Anonymised attack reports back to the community | No | Yes (automatic) |
| API key required | No | Yes (free tier available) |
| Data leaves your server | Never | Only attacker IP + threat category + timestamp |
What you get on each tier
The Hive plugin itself is fully functional on the Free tier — local protection, all sixteen sensors, all four 2FA methods. Paid tiers bundle managed delivery infrastructure (mail and SMS) and higher Community-Network quotas. See the Pricing page for the full comparison and to upgrade.
| Free | Contributor | Professional | Business | Enterprise | |
|---|---|---|---|---|---|
| Price / month (incl. VAT) | 0 € | 0 € | 14.90 € | 39.00 € | From 663 € |
| Price / year (≈ 17 % discount) | 0 € | 0 € | 149 € | 389 € | Custom |
| Minimum term | — | — | Monthly | Monthly | 12 months |
| API checks / day | 1,000 | 5,000 | 25,000 | 100,000 | Unlimited |
| Decoy-path detect-and-report (auto-managed .htaccess, since 2.0.11) | Yes | Yes | Yes | Yes | Yes |
| Coordinated-attack hardening mode (since 2.0.8) | — | — | Yes | Yes | Yes |
| Web Application Firewall — engine + baseline ruleset (since 2.1.2) | Yes | Yes | Yes | Yes | Yes |
| Priority Sync — advanced WAF rulesets (Paranoia Level 2/3) + live bot-IP / disposable feeds | — | Weekly | Daily | Daily | Daily |
| Verified-bot detection (official IP ranges + FCrDNS) | Yes | Yes | Yes | Yes | Yes |
| Disposable-email blocking & comment honeypot | Yes | Yes | Yes | Yes | Yes |
| Security headers — basic trio (X-Content-Type-Options, X-Frame-Options, Referrer-Policy) | Yes | Yes | Yes | Yes | Yes |
| Advanced security headers (HSTS, Permissions-Policy, CSP builder, cross-origin isolation) | — | — | Yes | Yes | Yes |
| Protection & hardening score (dashboard gauges, A+–F grade) | Yes | Yes | Yes | Yes | Yes |
Block-page reference codes (X-RIP-Ref) | Yes | Yes | Yes | Yes | Yes |
| MainWP integration (remote management) | Yes | Yes | Yes | Yes | Yes |
| Audit event trail (user-lifecycle log + CSV/JSON export, since 2.1.2) | — | — | — | Yes | Yes |
| Reports / day | 50 | 200 | 1,000 | 5,000 | Unlimited |
| Community threat feed (daily blacklist) | — | Yes | Yes | Yes | Yes |
| Domains per licence | 1 | 1 | 3 | 15 | Unlimited |
| 2FA mails / month (managed SMTP) | — | — | 500 | 2,500 | Unlimited (fair use) |
| 2FA SMS / month (managed worldwide relay) | — | — | 25 | 75 | Custom |
| Prepaid SMS bundles (50 / 200 / 500 SMS @ 14.90 / 49.90 / 99.90 € incl. VAT) | — | — | Yes | Yes | Yes |
| Prepaid mail bundles (1k / 5k / 25k mails @ 4.90 / 14.90 / 49.90 € incl. VAT) | — | — | Yes | Yes | Yes |
| Custom-branded mail templates | — | — | — | Yes | Yes |
| 2FA usage reports & analytics | — | — | Yes | Yes | Yes |
| Configurable 2FA policies per user role | — | — | Yes | Yes | Yes |
| Restrict user login times (per role / per user) | — | — | — | Yes | Yes |
| Bulk operations & analytics | — | — | Yes | Yes | Yes |
| Multi-site dashboard on reportedip.com | — | — | Yes | Yes | Yes |
| Advanced Security Keys (multiple WebAuthn keys, model detection, key alerts) | — | — | — | Yes | Yes |
| White-label (setup wizard, 2FA pages, mail templates) | — | — | — | Yes | Yes |
| WooCommerce Frontend-2FA (themed in-storefront challenge) | — | — | Yes | Yes | Yes |
| WooCommerce complete integration (white-label templates, Subscriptions / Memberships audit) | — | — | — | Yes | Yes |
| Full WP-CLI scripting | — | — | — | Yes | Yes |
| GDPR data-export tool | — | — | — | Yes | Yes |
| Weekly security report (PDF by mail) | — | — | Yes (weekly) | Yes (daily optional) | Yes |
| Cloud backup of Hive settings | — | — | 30 d | 90 d | 1 year |
| Log retention | 30 d | 30 d | 90 d | 1 year | Configurable |
| Support SLA | Community | Community | Email 48 h | Priority 12 h | Phone 4 h |
| Custom AVV / DPA | — | — | — | — | Yes |
Business is multi-bookable. Every Business figure above is per licence. Book Business x2, x5, x10 or x20 at checkout (or change it later in the Stripe Customer Portal) and the per-day checks/reports, the monthly 2FA mail/SMS allowance and the domain count all scale with your licence count — e.g. x5 = 75 domains and 500,000 checks/day. A volume discount applies automatically from x2 upwards. PRO stays single-licence; Enterprise figures are unlimited (fair use) and are never multiplied.
Bundle consumption order (PRO and Business): first the monthly included allowance (25 SMS / 500 mails on PRO, 75 / 2,500 on Business), then the prepaid bundle balance. Once both are exhausted the API returns HTTP 429 and Hive falls back to local wp_mail() for mail (or hard-caps SMS) — other 2FA methods stay operational. Bundle credits never expire. Stripe uses tax_behavior = inclusive for the gross-priced bundles (PAngV compliant); Reverse Charge / OSS is handled automatically by Stripe Tax.
- 2.1.0 — MainWP integration & block-page reference codes. Hive is now remote-manageable from a MainWP dashboard (aggregate security-metrics sync and API-key provisioning) with no extra child plugin, authenticated through the MainWP Child channel — no IPs, usernames, secrets or the API key leave the site. Every blocked response now carries a correlatable reference code (e.g.
WAF_SQLI-3F9A2B71), shown on the page and emitted as theX-RIP-Refheader; the incident token is a one-way hash of IP, reason and hour, so no personal data is exposed. The blocked page was rebuilt on the design system and fully translated. - 2.1.2 — Rule Delivery Framework + Web Application Firewall (Free engine, PRO depth). Server-delivered, versioned, Ed25519-signed, tier-staggered rulesets (
waf,bot_signatures,disposable_domains,scan_paths) verified against a bundled public key before they are applied — a tampered or unreachable feed can never poison the rules, and a bundled baseline works fully offline. The request-inspecting WAF and its OWASP-Top-10 Paranoia-Level-1 baseline are free on every plan; Professional unlocks the deeper, frequently-updated Level 2/3 ruleset via Priority Sync. ReDoS-hardened and fail-open, with an optional pre-WordPress drop-in (Apache / PHP-FPM auto-config, nginx snippet) that blocks before WordPress loads. - 2.1.2 — More free sensors. Verified-bot detection (official IP ranges + forward-confirmed reverse DNS — genuine crawlers are never blocked), disposable-email blocking at registration (privacy relays pass through), an invisible comment honeypot, basic security headers, a dashboard protection & hardening score (A+–F grade) — all free. Professional adds advanced security headers (HSTS, Permissions-Policy, CSP, cross-origin isolation); Business adds the audit event trail (schema v9 adds the
audit_logtable). - 2.1.3 — Verified-bot IPv6 fix. The forward-confirmation now resolves AAAA records as well, so genuine crawlers connecting over IPv6 are no longer flagged as fake;
facebookexternalhitis verified against Meta's published IP ranges instead of reverse DNS. - 2.1.4 — Firewall admin UX overhaul. The Overview tab is now a mini-dashboard (per-module status, 7-day activity counters, recent firewall event stream), every tab opens with a plain-language intro, and a new Server Setup tab gathers every web-server snippet in one place. Extended Protection setup is now verifiable — the status reports whether the guard actually executed for the current request. New specific WAF reason codes for SSRF, Log4Shell, PHP object injection, NoSQL, XXE, web-shell, CRLF and template injection.
- 2.1.5 – 2.1.8 — False-positive and fail-safe hardening. Verified search crawlers are exempt from the user-enumeration probe ladder (an SEO regression fix), bot classification became three-state (unknown is never flagged), the CIDR matcher rejects mismatched address families cleanly, loopback/private addresses are never reported as attackers, and removing the Extended Protection drop-in neutralises the guard to an inert placeholder instead of deleting it — a leftover
auto_prepend_filedirective can no longer 500 the site. - 2.1.9 – 2.1.11 — Backend-managed WAF exceptions. False positives can be relieved from the admin without touching code: a "WAF Exceptions" allowlist (scoped to a rule, a rule group or the engine on a path, optionally narrowed to an IP/CIDR) plus a one-click "Allow" action on every WAF log row. Exceptions also bake into the pre-WordPress drop-in, and every block decision now logs the matched value, target, method, URI and user-agent — diagnosable without reproducing the request. See WAF Exceptions below.
- 2.1.12 – 2.1.13 — MainWP provisioning & analytics dashboard. MainWP can switch a managed site into Community Network mode alongside key provisioning, and the security dashboard was reworked into a full analytics view (headline strip, seven threat families, WAF rule-group chart, severity breakdown, top attackers).
- 2.1.14 – 2.1.18 — Correctness under real-world hosting. All stored datetimes are UTC-consistent (auto-blocking silently failed on servers whose database timezone was not UTC), admin timestamps render in the site timezone, tier lookups are served purely from cache (no more hot-path quota polling), and API health is measured over a rolling window so a one-off outage no longer reports "degraded" forever.
- 2.1.17 – 2.1.20 — Extended Protection on nginx. PHP-FPM stacks are auto-configured via a document-root
.user.iniregardless of nginxlocationblocks, the guard skips body inspection for authenticated requests (editors saving posts can no longer trip it), disabling the WAF also neutralises the guard, and the Server Setup tab surfaces the manual php.ini /fastcgi_paramsnippets whenever the auto-written directive is not yet running. - 2.1.22 – 2.1.24 — 2FA enforcement without lockouts. A user who exhausts the grace period and skip quota is now signed in and sent straight into forced 2FA enrolment instead of being locked out (the old hard-lockout behaviour remains available as a policy option); administrators and super admins can never be hard-locked out. A duplicate submit of the 2FA challenge no longer strands users on a "session expired" page. Plus new WAF signatures: the PHPUnit
eval-stdin.phpRCE probe (CVE-2017-9841) is blocked on every plan. - 2.1.25 — REST-batch attack class blocked, encoded-payload bypass closed. Two new free baseline rules block the WordPress-core REST batch route-confusion primitive structurally (not by token, so variants do not evade them), the firewall now inspects a decoded copy of the request body (percent-encoded payloads smuggled inside JSON are matched), and Paranoia-Level-2/3 blocks render their specific reference category instead of a generic
BLOCKEDcode. - 2.1.26 – 2.1.28 — Crawler claims verified, reputation blocks everywhere. A user-agent claiming to be a crawler is cross-checked against forward-confirmed reverse DNS and official IP ranges before any sensor spares it; a central guard prevents every automatic block path from locking out a verified Googlebot, while credential-bearing events (failed logins, password sprays) bypass the bot allowlist entirely — genuine crawlers never submit credentials. A community-reputation hit now writes a temporary block covering every surface, not just the login form. Minimum WordPress raised to 5.9.
- 2.1.29 – 2.1.31 — Self-protection and smarter escalation. The server can no longer auto-block its own IP over cache-preload crawlers, WP-Cron loopbacks or REST self-requests (an upgrade migration lifts existing self-blocks), the escalation ladder weights attack volume (a 60-violation burst skips rungs instead of earning the minimum), repeat offences against one rule aggregate into a single log row without losing ladder credit, and author archive pages can be kept public separately from the
?author=Nenumeration block. - 2.1.32 — The performance release. 36 → 11 plugin queries per anonymous front-end request, the pre-WordPress blocklist answers from an 8 KB header instead of reading up to 1 MB per request, request bodies are read only when a rule actually inspects them, dashboard TTFB dropped from 920 ms to 278 ms on a 500k-row logs table, and retention cleanup runs in bounded chunks (schema v13 rebalances the index set). CIDR range blocks are enforced by the WordPress layer again.
- 2.1.33 – 2.1.36 — Official YubiKey / hardware security-key support. All three challenge surfaces complete a full WebAuthn ceremony, a security-key manager on the profile handles multiple named keys, registration detects the key model via attestation (AAGUID), a non-advancing signature counter (cloned key) is rejected and reported by mail, and the profile 2FA section was rebuilt around plain-language method cards with a user-selectable default method. One key per account is free on every plan; Advanced Security Keys (multiple keys, model detection, lifecycle alerts) are Business. See Hardware security keys.
6-Layer Defence
Hive applies its checks in order — each layer can short-circuit the request before it reaches the next. Hooked on init at priority 1 so that other plugins do not run for a blocked IP.
- Whitelist — trusted IPs and CIDR ranges are always allowed (your office, monitoring services, …).
- Local block list — IPs you have blocked manually, or that exceeded local thresholds. Stored in
wp_reportedip_hive_blocked. - Web Application Firewall — the active WAF ruleset is matched against the URI, query, body and user-agent; a hit is blocked through the shared, reference-coded 403 path. Whitelist- and content-author-aware to avoid false positives. An optional pre-WordPress drop-in can run this layer before WordPress even loads.
- Attempt counters — login, comment, XMLRPC, REST-burst and 404-scan counters trigger an automatic block once the threshold is reached.
- Community reputation — in Community Network mode, IPs with confidence ≥ threshold are blocked at the edge.
- 2FA challenge — protected accounts must complete a second factor to log in.
The Sixteen Attack Sensors
Every sensor can be toggled and tuned independently in Settings → Protection. The final two rows — block escalation and the WooCommerce login bridge — are companion mechanisms riding the same pipeline rather than separate sensors: escalation is the response ladder every sensor feeds into, and the WooCommerce bridge counts storefront login failures toward the existing brute-force sensor.
| Sensor | What it watches | Default threshold |
|---|---|---|
| Brute-force login | Failed logins per IP via wp_login_failed. | 5 in 15 min |
| Password spray | Distinct usernames attempted from the same IP (low-and-slow credential attacks). | 5 in 10 min |
| Comment spam | Comment posts per IP via comment_post. | 5 in 60 min |
| XMLRPC abuse | XMLRPC calls per IP via xmlrpc_call. | 10 in 60 min |
| REST-API burst | Anonymous REST requests per IP. Cookie-banner endpoints are bypassed by default (real-cookie-banner, complianz, borlabs-cookie, cookie-law-info). | 240 in 5 min |
| 404 / scan detector | High-rate 404s plus instant trigger on honeypot paths (.env, .git/config, wp-config.php.bak, …). | 12 in 2 min |
| Decoy-path detect-and-report | Bait paths (.env.backup, wp-config.old.php, db-dump-master.sql.php, admin-shell-console.php, …). A single hit returns one 403 and queues a high-severity community report — but does not trigger a local 24 h IP ban, so a backup plugin writing wp-config.old.php or an admin testing the bait URL cannot lock the site out of its own traffic. Apache .htaccess is auto-managed (marker block # BEGIN ReportedIP Hive Decoy placed above # BEGIN WordPress via insert_with_markers()) so real bait files on disk are routed through WordPress instead of being served directly by Apache. Nginx admins get a copy-paste rewrite ^ /index.php last; snippet in Settings. Filter reportedip_hive_decoy_paths extends the bait list. | 1 hit = 403 + community report |
| Web Application Firewall | Inspects the URI, query string, request body and user-agent against the active waf ruleset (SQLi, XSS, path traversal, command injection, LFI wrappers, SSRF, Log4Shell/JNDI, PHP object injection, NoSQL, XXE, web-shell uploads, CRLF, template injection). Engine + OWASP-Top-10 Paranoia-Level-1 baseline free on every plan; Professional unlocks the signed Level 2/3 rulesets via Priority Sync. ReDoS-hardened, fail-open, whitelist- and content-author-aware. Optional pre-WordPress drop-in blocks before WordPress loads. | Paranoia-Level selectable |
| Verified bot detection | Confirms a request claiming to be Googlebot, Bingbot or another crawler genuinely originates from it — a DNS-free match against the crawler's official IP ranges first, then a forward-confirmed reverse-DNS fallback. Spoofers are flagged (default) or blocked; genuine crawlers are never blocked. | Flag or block spoofers |
| Disposable-email blocking | Inspects the address at registration (WordPress + WooCommerce) against the disposable_domains list. Privacy relays (Apple Hide My Email, Firefox Relay, …) are a distinct category that passes through by default. | Off / monitor / block |
| Comment honeypot | An invisible, screen-reader-excluded decoy field on the comment form; spam bots that fill every field are rejected with no CAPTCHA friction for real visitors. | Always on (when enabled) |
| User enumeration | Blocks ?author=N, /wp-json/wp/v2/users, oEmbed user lookups; equalises invalid-user vs. wrong-password error responses. Author archive pages (/author/<slug>/) share the block by default and can be kept public with a separate switch. | 5 in 5 min |
| App-password monitor | Throttles application_password_failed_authentication; prevents Basic-Auth bypass of 2FA. | 5 in 15 min |
| Geo / ASN anomaly | Compares country and ASN at successful login against a 90-day rolling history; optionally revokes trusted-device tokens on anomaly. | ≥ 1 prior login required |
| Password strength | Enforces minimum length and character-class mix on enforced roles; optional Have-I-Been-Pwned k-anon check (SHA-1 prefix only). | 8 chars + classes |
| Hide login URL | Custom slug (default wp-login.php); the original URL returns a block page or a 404. | Slug 3–50 chars |
| Block escalation | Progressive ladder — repeat offenders pay more on each cycle. | 5 m → 15 m → 30 m → 24 h → 48 h → 7 d |
| WooCommerce login | WooCommerce account-form failures count toward the brute-force counter. | Inherits brute-force limit |
Progressive Block Escalation
Repeat offenders pay more. The default ladder is 5 min → 15 min → 30 min → 24 h → 48 h → 7 d. After 30 days clean the counter resets to step 1. First-time tripping legitimate visitors (CGNAT, fat-fingered admins, mobile-network egress) recover in minutes; persistent attackers reach the 7-day step.
The ladder, the reset window and the master toggle live under Settings → Blocking → Progressive blocking. The wizard's Protection step exposes the master toggle so fresh installs are escalation-aware from the first save. The fixed block_duration setting still applies when the ladder is toggled off. Sub-hour granularity is provided by ReportedIP_Hive_Database::block_ip_for_minutes().
Web Application Firewall & Rule Delivery
Since 2.1.2 Hive ships a request-inspecting Web Application Firewall. On init it matches the active waf ruleset against the URI, query string, request body and user-agent and blocks a hit through the shared, cache-safe, reference-coded 403 path. It is ReDoS-hardened (bounded PCRE backtracking, fail-open on a malformed rule), whitelist- and content-author-aware to avoid false positives, and adds roughly 4 µs of CPU per request with zero extra database queries when a persistent object cache is present.
The rules are not hard-coded in the plugin. They are delivered from the reportedip.com Rule API — server-delivered, versioned, Ed25519-signed and tier-staggered across four rulesets (waf, bot_signatures, disposable_domains, scan_paths). The plugin verifies every ruleset against a bundled public key before applying it and always falls back to a bundled baseline, so a tampered, oversized or unreachable feed can never poison your rules. New attack signatures reach all installations within hours, with no plugin release required.
- Free on every plan — the WAF engine and the OWASP-Top-10 Paranoia-Level-1 baseline ruleset, fully usable offline in Local Shield mode from the bundled baseline.
- Priority Sync (Professional and up) — the deeper, frequently-updated, signed Paranoia-Level-2/3 rulesets (obfuscation and bypass coverage) plus the live bot-IP-range and disposable-domain feeds. Free syncs the bundled baseline; Contributor weekly; Professional and above daily.
- Extended Protection drop-in (optional) — a pre-WordPress
auto_prepend_fileguard that runs the WAF before WordPress loads. Apache (.htaccess) and PHP-FPM stacks — including nginx + PHP-FPM — are auto-configured via a document-root.user.ini, which covers every PHP endpoint regardless of nginxlocationblocks (since 2.1.17); stacks without a FastCGI PHP SAPI get a php.ini / hosting-panelauto_prepend_fileline or an nginxfastcgi_paramsnippet from the Server Setup tab. The guard skips request-body inspection for authenticated requests by default, so signed-in editors saving content never trip it; URL and user-agent rules still run, and the in-WordPress engine remains the capability-aware backstop. Off by default; removal strips the directives Hive controls and neutralises the guard to an inert placeholder instead of deleting it (since 2.1.8), so a leftover directive in a hand-edited php.ini or nginx config can never point at a missing file and 500 the site. Disabling the WAF engine or switching to report-only also neutralises the guard automatically. - Reference codes — every block (WAF or sensor) carries a correlatable code such as
WAF_SQLI-3F9A2B71, shown on the block page and emitted as theX-RIP-Refheader. A wrongly-blocked visitor quotes one short string that an admin matches in the logs; the token is a one-way hash of IP, reason and hour, so no personal data is exposed.
Configuration and live status live under the dedicated Firewall menu: an Overview mini-dashboard (per-module status, 7-day counters, recent firewall events), a WAF tab (engine / mode / Paranoia-Level selector), a Bot Verification tab, a Spam Defence tab (disposable-email + honeypot), a Rule Sync status view and a Server Setup tab that gathers every web-server snippet in one place.
WAF Exceptions — Handling False Positives
Since 2.1.9 a false positive can be relieved from the admin without touching code — the way ModSecurity exclusions and the Wordfence allowlist work. A first-party endpoint that legitimately receives attack-like payloads (a form that accepts HTML, a security API ingesting reported attack data, a page builder posting raw markup) occasionally trips an injection signature; an exception makes that one case pass while the engine keeps protecting everything else.
- Where. Firewall → WAF → WAF Exceptions, plus a one-click "Allow" action on every WAF log row that pre-fills a narrow exception for exactly that rule on that path — no need to know the rule ID by heart.
- Scopes. An exception targets a single rule (by rule ID, taken from the WAF block log), a rule group (picked from the engine's known categories) or — for a first-party endpoint — the whole engine on a path, optionally narrowed to an IP or CIDR range. A whole-engine exception must always carry a path or IP restriction, so the firewall can never be globally disabled by accident.
- Scope it as tightly as possible. Prefer a single rule on a path over a rule group, and a rule group over a whole-engine exception. The block log records the matched value, inspected target, request method, URI and user-agent (since 2.1.11), so you can see exactly which rule fired and why before you allow it.
- Extended Protection honours the same list. Active exceptions are baked into the pre-WordPress drop-in guard and rebaked whenever the allowlist changes — the pre-WordPress layer and the in-WordPress engine never disagree.
- Multisite & plans. Exceptions are network-wide data, available on every plan — the protection engine itself stays free.
- Developer escape hatch.
apply_filters('reportedip_hive_waf_bypass_routes', [])excludes REST routes at code level. Matching is an anchored prefix test against the resolved WP REST route — never an unanchored substring of the raw URI — so a bypass token smuggled into an unrelated query parameter cannot disable the WAF.
Verified Bot Detection, Disposable-Email Blocking & Comment Honeypot
- Verified bot detection (free). Confirms that a request claiming to be Googlebot, Bingbot or another crawler genuinely originates from it — a DNS-free match against the crawler's official IP ranges first (Priority Sync), then a forward-confirmed reverse-DNS fallback that resolves both A and AAAA records. Spoofers are flagged (default) or blocked; a genuine crawler is never blocked.
facebookexternalhitis verified against Meta's published IP ranges. - Disposable-email blocking (free). Inspects the address on registration (WordPress and WooCommerce) against the throwaway-mail list. Three modes — off / monitor / block. Privacy relays (Apple Hide My Email, Firefox Relay, …) are a distinct category that passes through by default. The live list rides Priority Sync.
- Comment honeypot (free). An invisible, screen-reader-excluded decoy field on the comment form; spam bots that fill every field are rejected with no CAPTCHA friction for real visitors.
Security Headers
Hardening response headers on every front-end request. Headers already sent by your server or another plugin are detected and left untouched.
- Basic trio (free) —
X-Content-Type-Options,X-Frame-Options,Referrer-Policy. - Advanced (Professional) — HSTS,
Permissions-Policy, a Content-Security-Policy (report-only by default, with a builder) and the cross-origin isolation trio (COOP / CORP / COEP).
The Server Setup tab can additionally export the configured headers as server-level nginx add_header / Apache Header directives.
Protection & Hardening Score
Two dashboard gauges (0–100 plus an A+–F grade, Mozilla-Observatory style) rate your detection coverage and your hardening posture, with per-item deep links to switch a sensor on. Locked (paid) features count toward the visible potential, not against your score — so the free tier can still reach a top grade.
Security Dashboard & Analytics
The main dashboard opens with a headline strip — attacks blocked over the last 30 days, attacks blocked today, IPs currently blocked and how many of your protection layers are switched on (for example 17 / 20). Below it, the analytics pull from every sensor, not just the classic login / spam counters.
- Security Events timeline. A stacked-area chart grouping all activity into seven families — Login & Credential, Firewall (WAF), Scanners & Probes, Fake Bots, Recon & Enumeration, Spam & Flooding and Anomalies — over a selectable 7-, 30- or 90-day window.
- Threat Distribution. A breakdown of which attack family dominated the period, so you can see at a glance whether you are facing brute-force, firewall-level exploit attempts, scanners or spam.
- Firewall — Top Attack Types. The WAF blocks ranked by rule group (SQL injection, cross-site scripting, path traversal, Log4Shell, scanner user-agents, …).
- Severity Breakdown. Critical / High / Medium / Low counts, so the volume of serious events is never hidden inside a single total.
- Top Attackers (30 days). The most active source IPs with their hit count, when they were last seen and whether they are currently blocked or only monitored.
- Recent Activity. The live event stream, each entry tagged with its severity and threat family plus the relevant detail (matched WAF rule, probed path, spoofed bot name).
All counts are real on every plan — the dashboard reflects what your site actually blocked. Professional and Business plans add deeper analytics on top (longer history and log retention, attacker geography and the compliance-grade audit trail described below).
Audit Event Trail (Business)
An append-only user-lifecycle trail — logins, failed logins, password resets, profile updates, role changes (including the acting user), registrations and new-IP detection — with filters, CSV / JSON export, WordPress GDPR export/erasure integration and retention cleanup (1 year on Business, configurable on Enterprise). Stored in the dedicated audit_log table (schema v9). The standard 30-day security logs stay available on every plan; the audit trail is the compliance-grade record on top.
MainWP Integration
Hive is remote-manageable from a MainWP dashboard with no extra child plugin and no MainWP extension to buy. It hooks the MainWP Child mainwp_child_extra_execution filter, so every job is authenticated by the existing MainWP Child channel — no additional credentials, no new attack surface. Setup is simply: install MainWP Child and Hive on the managed site, connect the site to your MainWP dashboard as usual, done.
Two job types are answered:
- Security-metrics sync — aggregate counts only: active blocks, whitelist size, failed logins, comment spam, reputation blocks, queue size, recent critical events, 2FA-enabled users. Since 2.1.6 the sync also reports the firewall posture (
waf_enabled,waf_report_only,waf_dropin_enabled,waf_dropin_running,waf_serverand a derivedwaf_needs_setupflag), so a dashboard can flag sites whose Extended Protection is enabled but not yet running — typically an nginx host still waiting for its server snippet. - Provisioning (
reportedip_hive_provision) — push an API key to a managed site from the trusted dashboard, and since 2.1.12 optionally switch it into Community Network mode in the same job (communityflag). The sync job reports each child site's currentoperation_mode.
No IPs, usernames, secrets or the API key ever leave the managed site — the sync payload is counts and status flags only.
Multisite Networks
The Full Edition is network-only (Network: true, since 2.0.0): per-site activation is hidden by WordPress so the security configuration stays uniform across the network. All nine tables live under $wpdb->base_prefix, which makes every threat decision network-wide — cross-site brute-force attempts aggregate into one central counter, and a single block locks the IP out of every sub-site at once.
- Network Admins get the full settings surface and an all-sites Logs view.
- Site Admins on a sub-site get a read-only Status / Logs UI plus exactly two writable per-site overrides: the Frontend-2FA slug and additive 2FA-enforcement roles (a sub-site can enforce 2FA for more roles, never fewer).
- Cron runs only on the main site — no duplicate syncs or cleanup sweeps per sub-site.
- WAF exceptions are network-wide data, managed by the Network Admin.
Two-Factor Authentication (2FA)
Four methods are supported and can be combined per user. Recovery codes are generated on first setup. Secrets are encrypted at rest (libsodium with an OpenSSL fallback).
- TOTP — RFC 6238 (6 digits, 30-second window). Works with Google Authenticator, Authy, 1Password, Bitwarden, …
- Email — six-digit OTP via the configured mail provider; rate-limited (3 codes per 15 min, 5 verify attempts per code, 60 s resend cooldown).
- SMS — six-digit OTP via the managed reportedIP SMS relay (Professional plan and up; see below). Phone number is encrypted at rest.
- WebAuthn — passkeys, security keys (YubiKey), platform authenticators (Touch ID, Face ID, Windows Hello). In-house CBOR parser, no external dependency.
- Trusted devices — opt-in remember-this-device tokens with configurable expiry (default 30 days). Stored in
wp_reportedip_hive_trusted_devicesas SHA-256 hashes. - Recovery codes — 10 single-use
xxxx-xxxxcodes; low-codes warning at ≤ 3 remaining.
Hardware security keys (YubiKey)
Since the 2.1.33–2.1.36 series, hardware FIDO2 keys are a first-class citizen: the YubiKey 5 series (USB-A, USB-C, Lightning and the NFC models tapped against a phone), the Security Key by Yubico line and every other CTAP2 authenticator work on all three challenge surfaces — the wp-login interstitial, the WooCommerce storefront challenge and the password-reset gate. Older U2F-only keys (CTAP1) are not officially supported.
- Setting it up — open your profile page (Users → Profile → Two-Factor Authentication), choose Add security key → Security key (USB / NFC), give the key a name, then insert it and touch the gold contact when the browser prompts. On a phone, hold the key flat against the back near the top (NFC). No FIDO2 PIN is required for enrolment.
- One key per account is free. The Business plan adds Advanced Security Keys: several keys per account — register a second YubiKey and keep it in a safe place as a backup — plus automatic model detection ("YubiKey 5 Series with NFC" shown next to the key) and email alerts whenever a key is added or removed.
- Lost your key? Sign in with one of your recovery codes (or your backup key on Business), then remove the lost key on your profile page. Removing the last key disables the method cleanly.
- Clone detection — every sign-in advances the key's signature counter. An assertion whose counter does not advance is rejected, logged and reported to the account owner by mail on every plan.
- Algorithms — ES256 on every key; Ed25519 is negotiated automatically on YubiKey firmware 5.2.3+ when the server has libsodium.
2FA brute-force protection
The 2FA verifier ladder is 3 → 30 s, 5 → 5 min, 10 → 30 min, 15 → 1 h. When the count reaches the top step the IP is graduated to the central auto_block_ip() path (event 2fa_brute_force) which trips progressive escalation and Community-mode reporting like any other sensor.
Headless 2FA REST
For app integrations the plugin exposes three routes under namespace reportedip-hive/v1:
POST /2fa/challenge— username + password → challenge token + enabled methods (20 req / 5 min per IP).POST /2fa/verify— token + method + code → sets the auth cookie (30 req / 5 min per IP).GET /2fa/methods— introspect active methods for the current user.
WooCommerce Frontend Login
Hive's frontend 2FA stays inside your active storefront theme — customers logging in through [woocommerce_my_account], the classic checkout or the WooCommerce Cart / Checkout blocks complete their second factor on a themed page. The cart and checkout state survives the redirect roundtrip, the trusted-device cookie is shared with the wp-login flow.
- Configuration path — 2FA → Frontend login for WooCommerce.
- Configurable slugs — challenge slug (default
reportedip-hive-2fa) and setup slug (defaultreportedip-hive-2fa-setup); both editable, conflict-checked, and rewrite rules flush automatically when changed. - Tier downgrade — soft-disable on Free and Contributor plans; settings, slug choices and onboarding state are preserved, no data loss when re-upgrading.
- Conflict detection — Hive surfaces an admin notice when Solid Security, the WP Two-Factor plugin or Wordfence 2FA owns the login form, and disables the frontend challenge to avoid double-prompts.
- Plan availability — Professional and above. The free WooCommerce login-failure sensors (
woocommerce_login_failed,woocommerce_checkout_login_form_failed_login) remain on every plan and continue to feed the brute-force counter.
Mail and SMS Delivery
The mail layer runs through a pluggable provider contract (ReportedIP_Hive_Mailer). The default provider is WordPress wp_mail(); integrators can swap in their own without touching the rest of the plugin. On Professional and above, transactional mail (2FA codes, security notifications) can instead ride the managed reportedip.com mail relay — SPF-, DKIM- and DMARC-aligned sender infrastructure, so OTP mails do not land in spam the way an unauthenticated wp_mail() from shared hosting often does.
- SMS 2FA is a Professional feature delivered exclusively through the managed reportedip.com relay — no own SMS account, Twilio credentials or carrier contract required. It is configured automatically with a paid plan; enable it under Settings → 2FA → SMS. Per-recipient resend backoff climbs gently (
0 s → 30 s → 1 m → 2 m → 5 m → 15 m), so a slow or missed SMS can be re-requested without punishment while a genuine burst is still throttled. - Monthly allowances and prepaid bundles. PRO includes 25 SMS / 500 mails per month, Business 75 / 2,500 (per licence). Prepaid bundles top that up — see the tier table above for prices and the bundle consumption order paragraph for exactly what happens when a quota runs out (spoiler: mail falls back to local
wp_mail(), no 2FA method ever goes dark). - Custom-branded mail templates (Business and up). Business unlocks white-label transactional mail — your logo, colours and sender identity on 2FA and notification mails instead of the ReportedIP branding, matching the white-labelled setup wizard and 2FA pages.
Configuration Overview
All settings live under ReportedIP Hive → Settings. The most important defaults:
| Setting | Default | Description |
|---|---|---|
operation_mode | Local Shield | Local Shield or Community Network. |
block_threshold | 75 % | Minimum confidence score to block an IP (Community mode). |
login_threshold / _timeframe | 5 / 15 min | Failed-login attempts per IP before auto-block. |
comment_spam_threshold / _timeframe | 5 / 60 min | Comment posts per IP before auto-block. |
scan_404_threshold / _timeframe | 12 / 2 min | 404s per IP before scanner-block. |
xmlrpc_threshold / _timeframe | 10 / 60 min | XMLRPC requests per IP before auto-block. |
rest_burst_threshold / _timeframe | 240 / 5 min | Anonymous REST requests per IP. Consent-banner routes bypassed. |
block_duration_hours | 24 h | Fixed-length block (used when the ladder is off). |
block_escalation_enabled + block_ladder_minutes | On — 5,15,30,1440,2880,10080 | Progressive ladder (minutes per step). |
report_mode | Active | active (block) or report_only (log without blocking). |
data_retention_days | 30 days | How long security logs are kept before automatic deletion. |
auto_anonymize_days | 7 days | Anonymise IP and user-agent on log rows older than N days. |
cache_duration / negative_cache_duration | 24 h / 2 h | ETag cache TTL for positive / negative reputation lookups. |
max_api_calls_per_hour | 100 | Soft cap to spread API usage over the day. |
2fa_enforce_roles | (empty) | Comma-separated roles with mandatory 2FA. |
2fa_grace_days | 7 | Days before enforcement actually locks unenrolled users out. |
2fa_trusted_device_days | 30 | Trusted-device token expiry. |
hide_login_enabled / _slug / _response_mode | Off — — block_page | Custom wp-login slug; old URL returns block page or 404. |
Database Tables
Nine tables, created on activation and prefixed wp_reportedip_hive_. Schema version 13, with idempotent step-by-step migration on every plugin update; opt-in delete on uninstall. On Multisite every table lives under $wpdb->base_prefix so threat decisions apply network-wide.
logs— security events, JSON details, severity, reported-flag; the source for the dashboard analytics (7- / 30- / 90-day trends, family and severity breakdowns, top attackers).whitelist— trusted IPs and CIDR ranges; expiry optional.blocked— active blocks (manual / automatic / reputation), withblocked_until.attempts— per-IP counters per attempt type, with first/last timestamps.api_queue— pending and failed reports to the community API; retry logic.stats— daily aggregates (failed logins, blocks, spam, XML-RPC, reputation) for trend summaries and reports.trusted_devices— 2FA device tokens (SHA-256 hashes), IP and device name, expiry.audit_log— append-only user-lifecycle audit trail (Business); added in schema v9.waf_exceptions— the backend-managed WAF allowlist (rule / group / path scope, optional IP/CIDR); added in schema v10, network-wide.
Frontend Shortcodes & Auto-Footer
Embed a small "protected by Hive" badge anywhere on the site. All shortcodes render a single <rip-hive-banner> web component and pull live numbers from a 6-hour transient cache (no API call per page view).
[reportedip_badge]— small badge (default protect tone).[reportedip_stat]— single statistic (default trust tone).[reportedip_banner]— wide banner (default community tone).[reportedip_shield]— shield icon (default contributor tone).
Common attributes: stat (e.g. attacks_30d, reports_total), tone (protect / trust / community / contributor), color, background, label, intro. The auto-footer in the wizard uses the same component with a configurable variant and alignment.
WP-CLI Reference
The 2FA tooling is fully scriptable. Available under wp reportedip 2fa …:
wp reportedip 2fa status [--user=<id>]
wp reportedip 2fa enable <user_id> --method=<totp|email|sms|webauthn> [--secret=<base32>]
wp reportedip 2fa disable <user_id> [--method=<m>]
wp reportedip 2fa reset <user_id>
wp reportedip 2fa enforce --role=<role> [--remove]
wp reportedip 2fa audit [--user=<id>] [--since=<date>]
wp reportedip 2fa cleanup
Cache-Plugin Compatibility
Since 1.5.2 the blocked-page response defines DONOTCACHEPAGE, DONOTCACHEDB and DONOTCACHEOBJECT (respected by WP Rocket, W3 Total Cache, WP Super Cache and LiteSpeed Cache) and emits explicit Cache-Control: no-store, no-cache, must-revalidate, max-age=0, Pragma: no-cache plus the WordPress core nocache_headers() set. A single blocked attacker can no longer pollute the page cache with a 403 that legitimate visitors would otherwise receive until the cache expires.
Filters and Action Hooks
apply_filters('reportedip_hive_external_url', $url, $context)— replace any of the external URLs (privacy policy, registration, FAQ, …).apply_filters('reportedip_hive_rest_bypass_routes', $routes)— extend the list of REST-route prefixes that bypass the burst monitor (cookie-banner integrations).apply_filters('reportedip_hive_scan_paths', $paths)— extend the honeypot path list for the scan detector.apply_filters('reportedip_hive_decoy_paths', $paths)— extend the decoy-path bait list.apply_filters('reportedip_hive_waf_bypass_routes', $routes)— exclude REST routes from the WAF at code level (anchored prefix match against the resolved route; empty by default). Prefer the backend-managed WAF exceptions for one-off false positives.apply_filters('reportedip_hive_mail_provider', $provider)— swap in your own mail provider (implementinterface-mail-provider.php).do_action('reportedip_hive_ip_blocked', $ip, $reason)— fired when an IP is blocked.do_action('reportedip_hive_report_queued', $ip, $category)— fired when a report is enqueued for the API.
Frequently Asked Questions
The questions we get most often. Each answer links back to the relevant section above where appropriate.
General
What is Hive, and how does it relate to ReportedIP?
ReportedIP Hive is the WordPress plugin you install on your site. ReportedIP (reportedip.com) is the central service that aggregates threat intelligence. Hive can run completely standalone (Local Shield) or talk to the service (Community Network) — both are first-class modes.
Do I need an account to use the plugin?
No — Local Shield works without any account or API key. You only need a free ReportedIP account if you want to enable Community Network, which adds reputation lookups against the hive and shares anonymised attack reports back.
What does it cost?
The plugin itself is free under GPLv2+. Local Shield never requires a paid plan. Community Network ships with a free tier; higher tiers raise the daily check / report quotas. See the Dashboard for current quotas.
Is the plugin available on WordPress.org?
There are two editions. Hive Light is published on WordPress.org under the slug reportedip-hive — brute-force login protection plus optional community lookup, no 2FA, no upsell. The Full Edition documented on this page ships via GitHub Releases with one-click updates handled by the built-in Plugin-Update-Checker. The reason for two editions: wp.org guidelines disallow upsell, managed paid relays and multisite tier systems — all features the Full Edition relies on. See the Hive Light docs for the wp.org-distributed plugin. Important: do not install both plugins on the same site — they share the same text domain and class prefix.
Where is the source code? Can I audit it?
Yes — the full source lives at github.com/reportedip/reportedip-hive. Issues, pull requests, CHANGELOG and CI runs are all public.
Installation & Setup
How do I install the plugin?
Download reportedip-hive.zip from the latest GitHub release, then in WordPress: Plugins → Add New → Upload Plugin, select the ZIP, Install Now, Activate. The 10-step setup wizard launches automatically.
I skipped the setup wizard — how do I run it again?
Settings → ReportedIP Hive → top of the page has a "Re-run setup wizard" link. The wizard is non-destructive: it shows the current values as defaults so you can step through and only change what you need.
How do I switch between Local Shield and Community Network?
Settings → Connection → Operating Mode. No data is lost when you switch. Switching to Community Network requires a valid API key.
Can I import settings from another site?
Yes — Settings → Import / Export. The export is JSON, capped at 512 KB upload. API keys and 2FA secrets are not included for security; everything else (thresholds, ladders, whitelist, hide-login slug) is portable.
How do updates work?
Plugin Update Checker v5.6+ polls GitHub Releases every 12 hours. New versions appear inside Plugins like any other update — one-click install. Tag format must be vX.Y.Z; the release.yml workflow validates header + constant + readme stable-tag.
Modes & Sensors
What exactly is shared with the community when I am in Community Network mode?
Three things per attack: the attacker IP, the threat category (e.g. brute-force, comment-spam, XML-RPC, scanner) and a timestamp. Plus the API key of your site so the report is attributable to a reporter. Nothing else: no usernames, no passwords, no comment content, no end-user data, no site URLs in the payload.
What are the sixteen sensors and can I disable individual ones?
See "The Sixteen Attack Sensors" above for the full list and defaults. Yes — every sensor has a master toggle and threshold/timeframe knobs in Settings → Protection. You can also disable an entire sensor without disabling the rest.
What is "report-only mode"?
The plugin logs everything but blocks nothing. Useful when you tune thresholds on a busy site and want to see what would have been blocked before flipping the switch. Settings → Protection → Report-only mode.
How does progressive block escalation work?
Default ladder: 5 min → 15 min → 30 min → 24 h → 48 h → 7 d. Each repeat block within the reset window (default 30 days) advances one step. After 30 days clean the IP starts at step 1 again. CGNAT and fat-fingered admins recover in minutes; persistent attackers reach 7 days. Toggleable; falls back to fixed block_duration when off.
What is the "hide login URL" feature?
It replaces /wp-login.php with a custom slug (3–50 chars, blacklisted slugs rejected). Old URL returns either a Hive block page or a vanilla 404 — your choice. REST, AJAX, WP-CLI and password-reset flows are bypassed automatically so they keep working. Reduces the attack surface dramatically against scripted brute-forcers.
When Hide Login is active, repeated direct hits on the old /wp-login.php from one IP are treated as a scan and blocked on the standard escalation ladder. A single accidental visit stays harmless — only a pattern triggers a block. Tune the threshold or turn the block off under Settings → Hide Login.
Since 2.1.19 the custom login page is page-cache-safe: it opts out of every known page cache (WP Rocket, W3 Total Cache, WP Super Cache, WP Fastest Cache, Comet Cache, Cache Enabler, Hummingbird, LiteSpeed Cache) and follows the site's trailing-slash permalink convention, so sign-in works reliably behind caches and on nginx sites that enforce trailing slashes.
2FA
Which 2FA methods does Hive support?
Four: TOTP (RFC 6238 — Google Authenticator, Authy, 1Password, Bitwarden, …), Email OTP, SMS OTP (via the managed relay, Professional plan), WebAuthn (passkeys, YubiKey, Touch ID, Face ID, Windows Hello). Plus single-use recovery codes and trusted-device tokens.
Can I enforce 2FA for some users only?
Yes — pick the roles in Settings → 2FA → Enforced roles. Enforced users get a 5-step onboarding wizard at first login, with a configurable grace period (default 7 days). Since 2.1.22 the default after the grace period and skip quota are exhausted is forced enrolment, not a lockout: the user is signed in and sent straight into the setup wizard with no skip option. The previous hard-lockout behaviour is available as the "Block sign-in" policy — but administrators and super admins always take the forced-enrolment path, so a site can never lose its last sign-in-capable admin.
I lost my phone / authenticator — how do I get back in?
Use one of the ten recovery codes you saved during 2FA setup. If those are also lost, an administrator can reset 2FA for any user under Users → Two-Factor. As an absolute last resort: wp reportedip 2fa reset <user_id> via WP-CLI / SSH.
How long does a "trusted device" stay trusted?
Configurable; default 30 days. The token is a SHA-256 hash stored in wp_reportedip_hive_trusted_devices alongside the IP and a device name. The geo-anomaly sensor can revoke trusted-device tokens automatically on a country/ASN change.
Does WebAuthn work on all browsers?
Modern Chrome/Edge/Safari/Firefox on macOS, Windows, iOS, Android — yes. WebAuthn requires HTTPS (or localhost for dev). Older or hardened browsers without WebAuthn fall back to TOTP/Email/SMS automatically.
Can I integrate 2FA into a headless / mobile app?
Yes — the REST namespace reportedip-hive/v1 exposes POST /2fa/challenge, POST /2fa/verify and GET /2fa/methods. Throttled per IP (20 / 30 / unlimited per 5-minute window).
Performance & Compatibility
Does Hive work with WP Rocket / W3 Total Cache / WP Super Cache / LiteSpeed?
Yes — since 1.5.2 the blocked-page response sets DONOTCACHEPAGE, DONOTCACHEDB and DONOTCACHEOBJECT plus explicit Cache-Control: no-store, no-cache, must-revalidate, max-age=0, Pragma: no-cache and the WordPress core nocache_headers() set. A blocked attacker can no longer pollute the page cache.
Does it work behind Cloudflare?
Yes. The plugin reads CF-Connecting-IP first, then falls back to X-Forwarded-For and REMOTE_ADDR. Whitelist your origin's monitoring IPs if you proxy a status page through Cloudflare.
What about the WordPress block editor (Gutenberg) firing 50+ REST calls?
Since 1.2.2 logged-in users skip the global REST-burst monitor; only anonymous bursts count. The scanner-path match still applies (so Gutenberg cannot accidentally probe .env). Make sure you are running 1.2.2 or newer.
How do I keep API usage low?
The ETag cache holds positive lookups for 24 h and negative lookups for 2 h by default. Crank both up if you have a calm site. The dashboard exposes the live quota and the queue so you can see whether you are hitting the limit. Cron-driven batch reporting (every 15 min) coalesces individual events.
Will Hive slow down my site?
The block check is a single indexed query on wp_reportedip_hive_blocked per request, hooked at init priority 1. The whitelist is cached in memory per request. Reputation lookups are async: the public page is rendered first, the report is enqueued and shipped on the next cron tick.
Privacy & GDPR
Is the plugin GDPR compliant?
Yes — Local Shield never sends data anywhere, Community Network sends only the three fields above, user-agents are truncated to 50 characters, and IP addresses can be auto-anonymised after a configurable number of days. The full data-processing breakdown is in our privacy policy.
Do I need to mention Hive in my own privacy policy?
Yes if you run Community Network mode — disclose the use of Hive and the transmission of attacker IP / category / timestamp to reportedip.com. If you only run Local Shield, no transmission happens, but you still process IPs for security purposes (Art. 6 (1)(f) GDPR), which is worth a sentence in your policy.
What happens to my data if I uninstall?
Uninstall drops all wp_reportedip_hive_* tables and removes all reportedip_hive_* options. Reports already in the community database remain — they are not personally identifiable to your site (only the API-key hash links them).
Customisation & Extension
Cookie-banner / consent endpoint visitors get blocked — how do I extend the bypass list?
Since 1.5.0 the four common namespaces (real-cookie-banner, complianz, borlabs-cookie, cookie-law-info) are bypassed by default. For a custom stack, hook the filter:
add_filter('reportedip_hive_rest_bypass_routes', function ($routes) {
$routes[] = '/my-consent-plugin/v1';
return $routes;
});
The firewall keeps blocking a legitimate request on my site — how do I fix that without disabling the WAF?
Create a WAF exception — Firewall → WAF → WAF Exceptions, or click Allow directly on the offending log row. Scope it to a single rule on a path where possible; a whole-engine exception must always carry a path or IP restriction so the firewall can never be disabled globally by accident. Exceptions apply to the pre-WordPress Extended Protection guard too. For REST routes there is also a code-level filter, reportedip_hive_waf_bypass_routes. See WAF Exceptions above.
How do I add my own honeypot paths to the scan detector?
Hook reportedip_hive_scan_paths:
add_filter('reportedip_hive_scan_paths', function ($paths) {
$paths[] = '/.aws/credentials';
return $paths;
});
Can I write my own mail provider?
Yes — implement interface-mail-provider.php for mail and register it via the mailer filter (reportedip_hive_mail_provider). SMS, by contrast, is delivered exclusively through the managed reportedip.com relay (Professional plan and higher); there is no self-hosted SMS provider to configure.
Where is the data of the front-end shortcodes coming from?
A 6-hour transient cache. Keys: attacks_30d, attacks_total, blocked_active, whitelist_active, logins_30d, spam_30d, api_reports_30d, reports_total. The shortcodes never call the API per page view.
Quotas, Plans & Account
What does each role get?
See the Authentication docs for the full table. Short version: free (1,000 checks / 50 reports per day), contributor (5,000 / 200), professional (25,000 / 1,000), business (100,000 / 5,000), enterprise (unlimited), honeypot (unlimited).
The dashboard shows a queue backlog — what should I do?
Open Settings → API Queue. The "Retry" button (1.2.4 fix) actually fires the API call now, not just resets the status. If retries fail because of a quota, raise the cache duration or upgrade your plan.
Can I run Hive on a multisite / network install?
Yes — fully, since 2.0.0. The Full Edition is network-only (Network: true): per-site activation is hidden by WordPress so the security configuration stays uniform. All tables live under $wpdb->base_prefix, so a single threat decision applies network-wide — cross-site brute-force attempts aggregate into one central counter and one block locks the IP out of every sub-site. Network Admins get the full settings and an all-sites Logs view; Site Admins on a sub-site get a read-only Status / Logs UI plus two writable per-site overrides (Frontend-2FA slug and additive 2FA-enforcement roles). Cron runs only on the main site.
Troubleshooting
Plugin does not block any IPs
Check whether Report-Only Mode is enabled — it logs threats without blocking. Also verify that the block threshold is not set too high (default 75 %) and that Auto-blocking is on (the duration strategy is disabled while auto-blocking is off).
API connection errors in Community Network mode
Ensure your server can make outbound HTTPS requests to reportedip.com. Some hosts block outgoing connections by default. Verify the API key on the Dashboard.
Cookie-banner visitors get blocked
Since 1.5.0 the four common consent namespaces (real-cookie-banner, complianz, borlabs-cookie, cookie-law-info) are bypassed by default. If your stack uses a different namespace, extend the bypass list via the reportedip_hive_rest_bypass_routes filter.
Legitimate users get blocked
Add their IP addresses or CIDR ranges to the local whitelist. Whitelisted IPs are never blocked, regardless of reputation.
The firewall blocks a legitimate request (WAF false positive)
Open Firewall → WAF, find the block in the log (the visitor's X-RIP-Ref reference code from the block page matches a log row) and click Allow — it creates a narrow exception for exactly that rule on that path. See WAF Exceptions for scoping guidance. Exceptions apply to the pre-WordPress Extended Protection guard as well.
Extended Protection is enabled but shows "not running"
Typical on nginx hosts where the auto-written .user.ini directive is not picked up (e.g. user_ini.filename disabled, or the document root is not the scan path). The Firewall → Server Setup tab surfaces the manual options: the PHP-FPM-pool / php.ini auto_prepend_file line or the nginx fastcgi_param snippet. The status is verifiable — it reports whether the guard actually executed for the current request. The in-WordPress engine protects the site either way; the drop-in only moves the same checks earlier.
High API usage / running out of checks
Responses are cached locally (with ETag) for 24 hours by default. If you are still running out of checks, increase cache_duration or upgrade your plan. Monitor the queue and quota on the Dashboard.
Locked out by 2FA
Use one of the recovery codes saved during 2FA setup. If those are lost, an administrator can reset 2FA for any user under Users → Two-Factor. As a last resort: wp reportedip 2fa reset <user_id>.
Since 2.1.22 an enforced user who never set up 2FA is no longer locked out by default: once grace period and skips are exhausted they are signed in and sent straight into forced enrolment (no skip option). Administrators and Multisite super admins can never be hard-locked out, even if you switch the policy back to Block sign-in.
The block editor (Gutenberg) keeps getting throttled
The block editor fires 50+ REST calls in a few seconds. Since 1.2.2 logged-in users skip the global REST-burst monitor; only anonymous bursts count. Make sure you are running 1.2.2 or newer.
GDPR & Privacy
The plugin is designed with privacy in mind and is fully GDPR compliant.
- Local Shield mode: No data leaves your server. All detection and blocking happens locally.
- Community Network mode: Only attacker IP, threat category and timestamp are shared. No usernames, no passwords, no comment content, no end-user data.
- User-agents are truncated to 50 characters before storage.
- Automatic cleanup: Security logs are deleted after the configured retention period (default 30 days). Auto-anonymisation kicks in earlier (default 7 days).
- Encryption at rest: TOTP secrets, WebAuthn credentials and SMS phone numbers are encrypted with libsodium (OpenSSL fallback).
- No tracking: No cookies, no tracking pixels, no telemetry.
- WordPress privacy tools integration: Hive registers a personal-data exporter and eraser with WordPress core, so Tools → Export / Erase Personal Data requests automatically include Hive's records for the requested subject (log rows, trusted devices, audit-trail entries). It also contributes a suggested paragraph to the WordPress privacy-policy guide (Settings → Privacy → Policy Guide) that you can copy into your own policy.
- Open source: The full source code is published on GitHub — every line is auditable.
Changelog Highlights
- 2.1.33 – 2.1.36 — Official YubiKey / hardware security-key support: full WebAuthn ceremonies on all three challenge surfaces, a multi-key manager with attestation-based model detection (Business), cloned-key detection via signature-counter regression with mail alerts on every plan, Ed25519 when libsodium is available, and a rebuilt plain-language profile 2FA section with a user-selectable default method.
- 2.1.26 – 2.1.32 — Verified-crawler cross-checking (a spoofed Googlebot user-agent buys nothing), a central never-block-a-verified-bot guard, community-reputation blocks that cover every surface, self-block prevention for the server's own addresses, volume-weighted block escalation, and the performance release: 36 → 11 queries per request, an 8 KB blocklist header read and dashboard TTFB 920 → 278 ms (schema v13).
- 2.1.25 — The WAF blocks the WordPress-core REST batch route-confusion attack class on every plan (structural rules, not token matching), inspects a decoded copy of the request body (closing an encoded-payload bypass), and Paranoia-Level-2/3 blocks render their specific reference category.
- 2.1.22 – 2.1.24 — Enforced 2FA defaults to forced enrolment instead of a lockout (admins and super admins can never be hard-locked out); a duplicate submit of the 2FA challenge no longer strands users on "session expired"; the PHPUnit
eval-stdin.phpRCE probe (CVE-2017-9841) is blocked on every plan. - 2.1.14 – 2.1.20 — Production-hosting correctness: UTC-consistent datetimes (auto-blocking silently failed on non-UTC database servers), hidden login works behind page caches and on trailing-slash/nginx sites, Extended Protection auto-configures on nginx + PHP-FPM and skips body inspection for signed-in editors, API health uses a rolling window, and hot-path relay-quota polling was eliminated.
- 2.1.9 – 2.1.13 — Backend-managed WAF exceptions with a one-click "Allow" action (schema v10), self-explanatory block logging (matched value, target, method, URI, user-agent), MainWP provisioning can switch sites into Community mode, and the security dashboard became a full analytics view (seven threat families, WAF rule-group chart, top attackers).
- 2.1.0 – 2.1.8 — The firewall release: a server-delivered, Ed25519-signed Rule Delivery Framework feeding a request-inspecting Web Application Firewall (free engine + Paranoia-Level-1 baseline, PRO Level 2/3 via Priority Sync), verified-bot detection, disposable-email blocking, a comment honeypot, security response headers (basic free, advanced PRO), a dashboard protection & hardening score, block-page reference codes (
X-RIP-Ref), the Business audit event trail (schema v9), MainWP integration and a Firewall admin area — followed by false-positive fixes for genuine crawlers and the fail-safe drop-in removal. - 2.0.x — Network-wide multisite activation (
Network: true), per-blog tier management, tier-upgrade banners, app-password & geo-anomaly monitors hardened, WooCommerce frontend 2FA opens to PRO+, coordinated-attack Hardening Mode, decoy-path detect-and-report. - 1.5.2 — Cache-plugin compatibility on the 403 page; 2FA throttle graduates to real escalation block;
initpriority 1. - 1.5.1 — Blocking-tab clarity (Report-only > Auto-blocking > duration strategy); fixed-length and ladder editors swap inline.
- 1.5.0 — Progressive block escalation (5 m → 7 d ladder); cookie-banner endpoints bypassed by default; 404/comment-spam defaults relaxed.
- 1.2.4 — API-queue "Retry" button now actually fires the API call.
- 1.2.0 — Seven new sensors: app-password monitor, REST-burst monitor, user-enumeration block, 404/scan detector, geo-anomaly, password strength, hide-login URL.
- 1.1.0 — Central mailer with brand template.
- 1.0.0 — Initial public release: IP blocking, 4-method 2FA, setup wizard, list tables.
Full history: CHANGELOG.md on GitHub.
Looking for the smaller edition?
Last updated: · Maintained by the ReportedIP team