{"id":301525,"date":"2026-04-27T13:04:38","date_gmt":"2026-04-27T13:04:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/login-armor\/"},"modified":"2026-06-17T10:27:48","modified_gmt":"2026-06-17T10:27:48","slug":"login-armor","status":"publish","type":"plugin","link":"https:\/\/da.wordpress.org\/plugins\/login-armor\/","author":11816818,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.4.0","stable_tag":"2.4.0","tested":"7.0","requires":"6.8","requires_php":"8.1","requires_plugins":null,"header_name":"Login Armor","header_author":"Fabrice Ducarme","header_description":"Hide your login URL, block brute force attacks, harden WordPress, and monitor all admin activity.","assets_banners_color":"fafafa","last_updated":"2026-06-17 10:27:48","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/wpformation.com","header_plugin_uri":"https:\/\/wpformation.com\/login-armor","header_author_uri":"https:\/\/wpformation.com","rating":5,"author_block_rating":0,"active_installs":100,"downloads":2034,"num_ratings":3,"support_threads":2,"support_threads_resolved":2,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"wpformation","date":"2026-04-27 13:04:42"},"2.0.0":{"tag":"2.0.0","author":"wpformation","date":"2026-04-27 16:57:55"},"2.0.1":{"tag":"2.0.1","author":"wpformation","date":"2026-04-28 06:46:51"},"2.0.2":{"tag":"2.0.2","author":"wpformation","date":"2026-04-28 07:30:39"},"2.0.3":{"tag":"2.0.3","author":"wpformation","date":"2026-04-28 09:15:08"},"2.0.4":{"tag":"2.0.4","author":"wpformation","date":"2026-04-28 10:51:34"},"2.0.5":{"tag":"2.0.5","author":"wpformation","date":"2026-04-28 13:07:13"},"2.1.0":{"tag":"2.1.0","author":"wpformation","date":"2026-04-29 05:58:05"},"2.1.1":{"tag":"2.1.1","author":"wpformation","date":"2026-04-29 16:52:57"},"2.1.10":{"tag":"2.1.10","author":"wpformation","date":"2026-05-05 13:35:50"},"2.1.11":{"tag":"2.1.11","author":"wpformation","date":"2026-05-05 16:54:05"},"2.1.12":{"tag":"2.1.12","author":"wpformation","date":"2026-05-11 07:24:30"},"2.1.13":{"tag":"2.1.13","author":"wpformation","date":"2026-05-11 15:47:32"},"2.1.14":{"tag":"2.1.14","author":"wpformation","date":"2026-05-20 09:39:54"},"2.1.15":{"tag":"2.1.15","author":"wpformation","date":"2026-05-20 19:30:50"},"2.1.16":{"tag":"2.1.16","author":"wpformation","date":"2026-05-20 22:05:36"},"2.1.17":{"tag":"2.1.17","author":"wpformation","date":"2026-06-05 05:27:35"},"2.1.18":{"tag":"2.1.18","author":"wpformation","date":"2026-06-05 07:09:59"},"2.1.19":{"tag":"2.1.19","author":"wpformation","date":"2026-06-05 09:13:44"},"2.1.2":{"tag":"2.1.2","author":"wpformation","date":"2026-04-29 19:59:32"},"2.1.21":{"tag":"2.1.21","author":"wpformation","date":"2026-06-05 13:19:59"},"2.1.22":{"tag":"2.1.22","author":"wpformation","date":"2026-06-08 14:01:45"},"2.1.23":{"tag":"2.1.23","author":"wpformation","date":"2026-06-10 14:39:36"},"2.1.25":{"tag":"2.1.25","author":"wpformation","date":"2026-06-11 11:33:19"},"2.1.26":{"tag":"2.1.26","author":"wpformation","date":"2026-06-11 14:36:57"},"2.1.3":{"tag":"2.1.3","author":"wpformation","date":"2026-04-29 20:36:16"},"2.1.4":{"tag":"2.1.4","author":"wpformation","date":"2026-04-30 09:16:15"},"2.1.6":{"tag":"2.1.6","author":"wpformation","date":"2026-04-30 19:38:48"},"2.1.7":{"tag":"2.1.7","author":"wpformation","date":"2026-05-02 14:38:40"},"2.1.8":{"tag":"2.1.8","author":"wpformation","date":"2026-05-02 15:42:39"},"2.1.9":{"tag":"2.1.9","author":"wpformation","date":"2026-05-05 12:37:37"},"2.2.0":{"tag":"2.2.0","author":"wpformation","date":"2026-06-15 13:23:10"},"2.3.0":{"tag":"2.3.0","author":"wpformation","date":"2026-06-16 16:45:41"},"2.4.0":{"tag":"2.4.0","author":"wpformation","date":"2026-06-17 10:27:48"}},"upgrade_notice":{"2.4.0":"<p>New: an optional Request Firewall (8G-inspired PHP filter) that blocks malicious requests - off by default, starts in monitor mode (logs without blocking), admins never filtered. Plus a first-run onboarding wizard with a one-click safe baseline. All opt-in; existing sites unchanged.<\/p>","2.3.0":"<p>Account-security release: Password Policy (length\/complexity + reject breached passwords via privacy-preserving HIBP), Session Management (idle timeout, max lifetime, single session), and opt-in IP Geolocation. All off by default; nothing changes until you enable it.<\/p>","2.2.0":"<p>New: the AI Security Briefing turns your last 30 days of activity into a plain-language verdict, an IP picture and prioritised actions, on top of a deterministic facts snapshot. Built on the WordPress 7 native AI Client - uses your own connector, no API key stored, runs on click.<\/p>","2.1.26":"<p>Fixes email\/backup 2FA bouncing to &quot;session expired&quot; on browsers that don&#039;t return the verification cookie on submit (some Chrome setups; Firefox worked). The form now also carries the session token, so login works regardless. Recommended if Email 2FA is enabled. Security unchanged.<\/p>","2.1.25":"<p>Fixes email\/backup two-factor verification being rejected (&quot;session expired&quot;) in some browsers, notably Chrome, while Firefox worked. The form is now uncached and authenticated by the signed same-site cookie. Recommended if Email 2FA is enabled.<\/p>","2.1.24":"<p>Fixes a fatal error (HTTP 500 \/ &quot;network error&quot;) during authenticator-app (TOTP) setup on hosts whose wp-config.php does not define AUTH_KEY, such as some Infomaniak installs. Recommended if Two-Factor is enabled. Existing setups are unaffected.<\/p>","2.1.23":"<p>Fixes the two-factor login screen: the &quot;use a different method&quot; links now work (and email a fresh code when switching to Email), expired\/locked sessions explain themselves, and the authenticator-setup button reports errors. Recommended for 2FA users.<\/p>","2.1.22":"<p>Fixes a Security Score that under-counted active modules: Brute Force and Detection (on by default) are now scored correctly, so the header, the score number and the module list agree. Display and scoring only \u2014 recommended for all installs.<\/p>","2.1.21":"<p>Cosmetic patch: cleaner user-agent labels in the Events table \u2014 Jetpack\/WordPress.com clients are recognised, and long agents are trimmed at a word boundary with an ellipsis instead of a chopped-off string with a dangling parenthesis.<\/p>","2.1.20":"<p>Migration-friendly integrity: a security-key change now shows an amber &quot;Keys changed&quot; advisory with one-click chain re-baseline instead of a false &quot;TAMPERED&quot; alarm. Adds an XML-RPC blind-spot warning when Hide Login is on but XML-RPC stays open. Completes the French translation.<\/p>","2.1.19":"<p>Clearer attack-type labels + descriptions on incidents, French translation of the visible admin tabs, translatable toast notifications, and a fix for the Activity Log integrity badge staying &quot;UNVERIFIED&quot; after a successful verify. Recommended for all installs.<\/p>","2.1.18":"<p>Patch. Fixes &quot;Select all&quot; \/ bulk actions when incidents are all resolved (checkboxes now on every card) and only labels the attack vector for XML-RPC\/REST (no more misleading &quot;via login form&quot;). Recommended for 2.1.17 users.<\/p>","2.1.17":"<p>Feature release. Incidents now show the attack vector (XML-RPC \/ REST \/ login form) \u2014 spot which attempts bypass your hidden login URL \u2014 plus bulk mark-resolved\/ignore. Adds a vector column to the incidents table (auto migration). Recommended for all installs.<\/p>","2.1.16":"<p>Bug fix release from an external audit. Fixes plain-permalinks compat (Hide Login URL, REST API allowlist), restores activity-log coverage for 2FA, frontend registration and password reset, and extends Honeypot to WooCommerce + frontend login forms. Recommended for all installs.<\/p>","2.1.15":"<p>Fixes a fatal TypeError when third-party plugins (e.g. WP Fastest Cache) call WordPress URL builders with off-contract argument types. Strict parameter hints relaxed on seven callbacks; return types unchanged. Neutral on canonical WP calls.<\/p>","2.1.14":"<p>Bug fix. The prevent_author_enum hardening toggle no longer blocks the legitimate ?author=N filter in wp-admin Posts\/Pages lists (&quot;All \/ Mine \/ &quot; links). Public enumeration block unchanged. Three-line fix.<\/p>","2.1.13":"<p>Bug fix. Silent 2FA failure on installs with permalink_structure without trailing slash (e.g. \/%postname%) \u2014 the verify cookie path mismatched the request path after handle_loaded&#039;s normalisation. Fixed cookie path to omit trailing slash. Neutral on trailing-slash installs.<\/p>","2.1.12":"<p>Bug fix. Hide Login rendered without CSS when both apex and www routed to the same WP (shared hosting). Two fixes: canonical-host 301 in Hide Login + host-aware CSP in Login Page Security Headers. Neutral on single-host installs. New filter login_armor_canonical_host_redirect for opt-out.<\/p>","2.1.11":"<p>Bug fix for multisite + domain mapping: the Hide Login URL is now host-aware (picks home_url or site_url from HTTP_HOST), fixing a 2.1.9 regression where mapped subsites redirected to \/wp-admin\/ (404). Standard and headless installs keep working.<\/p>","2.1.10":"<p>Cosmetic fix. The 404 page served when an anonymous visitor hits <code>\/wp-admin\/<\/code> with Hide Login enabled now renders as a proper WordPress 404 (body class <code>error404<\/code>, SEO <code>noindex<\/code> meta, theme 404 template) instead of a half-bootstrapped page. No security or functional change.<\/p>","2.1.9":"<p>Bug fix. Hide Login now builds the rewritten login URL from <code>site_url()<\/code> (matching <code>wp_login_url()<\/code> in WP core) instead of <code>home_url()<\/code>. Fixes silent breakage on multisite headless, WordPress in subdirectory, and reverse-proxy installs. Neutral on standard installs.<\/p>","2.1.8":"<p>Hygiene release after a full 2.1.7 audit. Three LOW fixes: the webhook stats query no longer warns on fresh installs, the lockout_window option is cleaned on uninstall, and five missing French translations were added. No end-user-visible change.<\/p>","2.1.7":"<p>Preventive: hardens the Email 2FA enrollment flow. Failed <code>wp_mail()<\/code> no longer leaves a half-committed 2FA state, and a new pre-activation modal forces a real test email + a safety-net check before the user can lock themselves out. Recommended for every install where Email-based 2FA is enabled.<\/p>","2.1.6":"<p>Preventive release. Eliminates a latent V2.1.3-style fatal risk in the TwoFactor module. Finishes the uninstall.php cleanup (zero residual data). Surfaces Activity Log integrity coverage scope in admin UI. No new features, no DB migration.<\/p>","2.1.4":"<p>Critical hotfix: 2.1.3 fatal-errored on every fresh install (Class &quot;LoginArmor\\ActivityLog\\ActivityLog&quot; not found). Sites with Activity Log already enabled were unaffected. Recommended for every install, urgent for new installs.<\/p>","2.1.3":"<p>Critical hotfix: Hardening &quot;Hide WP version&quot; was stripping cache-buster from our own assets, so updates past 2.1.0 were invisible behind hosting CDNs (LiteSpeed LSADC, Cloudflare). Recommended for every install.<\/p>","2.1.2":"<p>Critical hotfix: the Settings tab fatal-errored on every fresh install that had not yet enabled the Activity Log module (Class WebhookDispatcher not found). Recommended for every install.<\/p>","2.1.1":"<p>Activity Log integrity: every row is HMAC-signed and chained, detects any tampering. Optional signed webhook forwarding (SIEM \/ Slack \/ Datadog \/ any HTTPS). New WP-CLI verify-chain. Bundles 6 hardening fixes. Migration automatic. Recommended for every install.<\/p>","2.1.0":"<p>Security: 2FA pending token moved from URL query string to a signed HttpOnly + SameSite=Strict cookie. Closes URL-leak (browser history \/ Referer \/ access logs) and DB-leak (clear token no longer in wp_options). Recommended for every install with 2FA enabled.<\/p>","2.0.5":"<p>Security audit pass: REST author-enum scope, optional HSTS, IPv6 subnet fix, 0.0.0.0 placeholder DoS skip, .htaccess admin-rules preservation. No regression. Recommended.<\/p>","2.0.4":"<p>Real fix for the lockout 429 page on hosts with a public page cache (LiteSpeed Cache, WP Rocket, Cloudflare). Recommended after the 2.0.1-2.0.3 sequence.<\/p>","2.0.3":"<p>Hotfix: HTTP\/2 stream termination on LiteSpeed\/LSAPI for the branded lockout page. Recommended.<\/p>","2.0.2":"<p>Critical fix: 429 branded lockout page now reaches the browser. Recommended.<\/p>","2.0.1":"<p>Branded 429 lockout page on the triggering attempt + Reset Stats UI + correct WP.org banner\/icon. Recommended.<\/p>","2.0.0":"<p>First WordPress.org release of the V2 line. Eight independent security modules. Recommended.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":3},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3517031,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3517031,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3517031,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3517031,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.1.0","2.1.1","2.1.10","2.1.11","2.1.12","2.1.13","2.1.14","2.1.15","2.1.16","2.1.17","2.1.18","2.1.19","2.1.2","2.1.21","2.1.22","2.1.23","2.1.25","2.1.26","2.1.3","2.1.4","2.1.6","2.1.7","2.1.8","2.1.9","2.2.0","2.3.0","2.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.gif":{"filename":"screenshot-1.gif","revision":3516680,"resolution":"1","location":"assets","locale":"","width":960,"height":648},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3516680,"resolution":"10","location":"assets","locale":"","width":641,"height":732},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3516680,"resolution":"11","location":"assets","locale":"","width":1043,"height":959},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3516680,"resolution":"2","location":"assets","locale":"","width":1366,"height":1063},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3516680,"resolution":"3","location":"assets","locale":"","width":1059,"height":635},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3516680,"resolution":"4","location":"assets","locale":"","width":1229,"height":1086},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3516680,"resolution":"5","location":"assets","locale":"","width":1062,"height":910},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3516680,"resolution":"6","location":"assets","locale":"","width":1389,"height":554},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3516680,"resolution":"7","location":"assets","locale":"","width":1359,"height":858},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3516680,"resolution":"8","location":"assets","locale":"","width":1452,"height":807},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3516680,"resolution":"9","location":"assets","locale":"","width":1052,"height":1022}},"screenshots":{"1":"Quick tour of all eight modules - Hide Login, Hardening, 2FA setup with QR code, Incidents drill-down, Activity Log, Events, and Overview dashboard.","2":"Overview dashboard - health cards, security pulse, live event tail, threat banner that surfaces active attacks.","3":"Incidents - real-time pattern detection grouped by attack class with severity and one-click resolution.","4":"Incident drill-down - full timeline, user-agent fingerprint, suggested actions, escalation flag.","5":"Events - complete login attempts log with filters and CSV export.","6":"Activity Log - admin action audit trail across seven domains, filterable and exportable.","7":"Settings - modular configuration with live security score and a sticky save bar.","8":"Hide Login pre-activation modal - pick or generate the secret URL and email it to yourself before flipping the switch.","9":"Hardening - thirteen one-click toggles grouped by surface reduction, credential hardening, and request filtering.","10":"Two-factor authentication setup - QR code for any authenticator app, copy-paste fallback, and live verification.","11":"Breach Check - fully transparent k-anonymity lookups, separate password and email toggles, opt-in email check disabled by default."}},"plugin_section":[262246],"plugin_tags":[8531,2439,25642,4552,1229],"plugin_category":[],"plugin_contributors":[192025],"plugin_business_model":[],"class_list":["post-301525","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-activity-log","plugin_tags-brute-force","plugin_tags-hide-login","plugin_tags-limit-login","plugin_tags-login-security","plugin_contributors-wpformation","plugin_committers-wpformation"],"banners":{"banner":"https:\/\/ps.w.org\/login-armor\/assets\/banner-772x250.png?rev=3517031","banner_2x":"https:\/\/ps.w.org\/login-armor\/assets\/banner-1544x500.png?rev=3517031","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/login-armor\/assets\/icon-128x128.png?rev=3517031","icon_2x":"https:\/\/ps.w.org\/login-armor\/assets\/icon-256x256.png?rev=3517031","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-1.gif?rev=3516680","caption":"Quick tour of all eight modules - Hide Login, Hardening, 2FA setup with QR code, Incidents drill-down, Activity Log, Events, and Overview dashboard."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-2.png?rev=3516680","caption":"Overview dashboard - health cards, security pulse, live event tail, threat banner that surfaces active attacks."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-3.png?rev=3516680","caption":"Incidents - real-time pattern detection grouped by attack class with severity and one-click resolution."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-4.png?rev=3516680","caption":"Incident drill-down - full timeline, user-agent fingerprint, suggested actions, escalation flag."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-5.png?rev=3516680","caption":"Events - complete login attempts log with filters and CSV export."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-6.png?rev=3516680","caption":"Activity Log - admin action audit trail across seven domains, filterable and exportable."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-7.png?rev=3516680","caption":"Settings - modular configuration with live security score and a sticky save bar."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-8.png?rev=3516680","caption":"Hide Login pre-activation modal - pick or generate the secret URL and email it to yourself before flipping the switch."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-9.png?rev=3516680","caption":"Hardening - thirteen one-click toggles grouped by surface reduction, credential hardening, and request filtering."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-10.png?rev=3516680","caption":"Two-factor authentication setup - QR code for any authenticator app, copy-paste fallback, and live verification."},{"src":"https:\/\/ps.w.org\/login-armor\/assets\/screenshot-11.png?rev=3516680","caption":"Breach Check - fully transparent k-anonymity lookups, separate password and email toggles, opt-in email check disabled by default."}],"raw_content":"<!--section=description-->\n<p><strong>Twelve security modules. One lightweight plugin. Zero compromise.<\/strong><\/p>\n\n<p>Login Armor is a complete WordPress security stack built for agencies, freelancers and pros who deliver audit-ready sites. No premium tier, no bundled marketing dashboard, no telemetry. Every module runs locally, ships with safe defaults, and stays out of your way.<\/p>\n\n<p>Stop juggling Wordfence's bloat, Solid Security's upsells, and Limit Login Attempts' gaps \u2014 Login Armor delivers twelve independent modules in about one megabyte.<\/p>\n\n<h4>New in 2.4.0<\/h4>\n\n<ul>\n<li><strong>Request Firewall<\/strong> \u2014 an optional, 8G-inspired PHP filter that blocks malicious requests (SQL injection, code execution, traversal, XSS, disallowed HTTP methods) before WordPress finishes loading, on Apache, Nginx and LiteSpeed alike. Off by default, it starts in monitor mode and never filters logged-in administrators; every block is logged, aggregated to one incident per IP per hour.<\/li>\n<li><strong>Guided onboarding<\/strong> \u2014 a first-run wizard offers a one-click \"safe baseline\" that turns on the no-risk essentials, so a beginner is protected in seconds. The same \"Apply safe baseline\" button stays available any time.<\/li>\n<\/ul>\n\n<h4>Why Login Armor<\/h4>\n\n<ul>\n<li><strong>No upsells, ever.<\/strong> No \"premium\" tier, no greyed-out \"Pro\" buttons. Every feature is GPL.<\/li>\n<li><strong>No external services to sign up for.<\/strong> No API keys, no remote dashboards, no telemetry. The only outbound calls are opt-in: Have I Been Pwned (breach\/password checks), Slack\/Discord\/webhook (notifications), the keyless ipwho.is API (geolocation), and your own WordPress 7 AI connector.<\/li>\n<li><strong>Built to be invisible.<\/strong> Sub-megabyte ZIP, lazy-loaded modules, indexed queries \u2014 under 2 ms on a normal login flow.<\/li>\n<li><strong>Multisite-aware, PHP 8.1-native, production-grade defaults.<\/strong> Network-activate a fleet, configure per-site, manage from a complete WP-CLI suite; zero-config gets you 80 percent of the protection.<\/li>\n<\/ul>\n\n<h4>Twelve independent modules<\/h4>\n\n<ol>\n<li><strong>Hide Login<\/strong> \u2014 Replace wp-login.php with a custom slug; the old URL returns a 404, and a branded pre-activation modal lets you pick or generate the slug and emails it to you so you can't lock yourself out. Compatible with multisite, reverse proxies and password-recovery flows.<\/li>\n<li><strong>Brute Force Protection<\/strong> \u2014 Cascading lockouts escalating to a 24-hour ban, with subnet blocking and trusted X-Forwarded-For; lostpassword, register, XML-RPC and the REST users endpoint are all gated when an IP is locked, and every lockout surfaces as an incident.<\/li>\n<li><strong>Hardening<\/strong> \u2014 Fifteen one-click toggles across surface reduction, credential hardening, request filtering and account monitoring: disable XML-RPC\/pingbacks, the file editor, version exposure, application passwords and author enumeration; block reserved usernames (Unicode-confusable detection); add a login honeypot; get alerted on new administrators.<\/li>\n<li><strong>Two-Factor Authentication<\/strong> \u2014 TOTP, one-time codes by email and printable backup codes, with trusted devices for thirty days, per-role enforcement, a configurable grace period and an email recovery flow when the authenticator is lost.<\/li>\n<li><strong>Detection and Incidents<\/strong> \u2014 A real-time engine groups raw events into six attack patterns, each with a drill-down (timeline, source IPs, target users, severity, UA fingerprint) and one-click actions (reset password, block subnet, mark resolved).<\/li>\n<li><strong>Activity Log<\/strong> \u2014 A compliance-ready, tamper-evident (hash-chained) audit trail of admin actions across seven logger domains, with filtering, CSV export, configurable retention and optional signed webhook forwarding to a SIEM.<\/li>\n<li><strong>Login Page Security Headers<\/strong> \u2014 Content-Security-Policy, X-Frame-Options, Permissions-Policy, Referrer-Policy and X-Content-Type-Options on wp-login.php and the lockout page, in two presets with an optional CSP report-uri; baseline headers can optionally extend site-wide.<\/li>\n<li><strong>Breach Check<\/strong> \u2014 Detect logins using a breached password via privacy-preserving k-anonymity against Have I Been Pwned (only a 5-character SHA-1 prefix leaves the server); optional XposedOrNot email lookup, fail-soft so an outage never blocks login.<\/li>\n<li><strong>Password Policy<\/strong> \u2014 Enforce strong, unique passwords at registration, profile update and reset: minimum length and character classes, forbid the username inside the password, optionally reject breached passwords, with optional non-locking expiration nudges.<\/li>\n<li><strong>Session Management<\/strong> \u2014 Idle-timeout logout measured on real page loads, a maximum session lifetime regardless of \"remember me\", an optional single-active-device restriction, and a one-click \"sign out all other devices\".<\/li>\n<li><strong>IP Geolocation<\/strong> \u2014 Show the attacker's country on the Incidents and Events tabs; lazy, cached thirty days, capped per page load, private ranges never sent. Keyless ipwho.is by default, swappable for an offline database via a filter.<\/li>\n<li><strong>Request Firewall<\/strong> \u2014 An optional, 8G-inspired PHP filter that blocks malicious query strings, paths, HTTP methods and (opt-in) user-agents\/referrers before WordPress loads, on Apache\/Nginx\/LiteSpeed alike; off by default, starts in monitor mode, never filters admins, skips REST\/cron\/WP-CLI, with an IP\/path allowlist (CIDR). Not scored.<\/li>\n<\/ol>\n\n<h4>AI Security Briefing (optional)<\/h4>\n\n<p>Built on the WordPress 7 native AI Client, one click turns your last thirty days of activity into a plain-language verdict, an IP picture and a short list of prioritised actions; \"Explain with AI\" does the same on a single incident. Minimised mode (anonymised signals) is the default and deep mode is an explicit opt-in. No API key is stored \u2014 it uses your own WordPress AI connector, so provider and cost stay yours. It always leads with a deterministic facts snapshot that works with or without AI.<\/p>\n\n<h4>Plus<\/h4>\n\n<ul>\n<li><strong>Guided onboarding<\/strong> \u2014 a first-run wizard with a one-click safe baseline (Simple) or manual setup (Advanced); the \"Apply safe baseline\" button stays available, and upgrading sites never see the wizard.<\/li>\n<li><strong>Security score<\/strong> \u2014 a weighted 0-100 read of your posture with a one-click \"next best action\"; observability features (geolocation, notifications, the AI assistant) are deliberately not scored.<\/li>\n<li><strong>Conflict detection<\/strong> \u2014 warns when another login-security plugin (Wordfence, Solid Security, Sucuri, All-In-One Security, SecuPress and more) or a cache plugin (with Hide Login on) could clash.<\/li>\n<li><strong>Notifications<\/strong> \u2014 email, Slack, Discord or webhook with SSRF-safe URL validation, severity threshold and rate limiting.<\/li>\n<li><strong>WP-CLI suite<\/strong> and a <strong>dashboard widget<\/strong> (14-day sparkline, six headline metrics).<\/li>\n<\/ul>\n\n<p>GPL forever. PHP 8.1+. WordPress 6.8+. Zero dependencies.<\/p>\n\n\n\n<p><strong>Douze modules de s\u00e9curit\u00e9. Une seule extension l\u00e9g\u00e8re. Z\u00e9ro compromis.<\/strong><\/p>\n\n<p>Login Armor est une stack compl\u00e8te de s\u00e9curit\u00e9 WordPress con\u00e7ue pour les agences, les freelances et les pros qui livrent des sites pr\u00eats \u00e0 passer un audit. Pas de version premium, pas de tableau de bord marketing int\u00e9gr\u00e9, pas de t\u00e9l\u00e9m\u00e9trie. Chaque module tourne en local, embarque des r\u00e9glages par d\u00e9faut s\u00e9curis\u00e9s, et reste discret.<\/p>\n\n<p>Fini de jongler entre la lourdeur de Wordfence, les fen\u00eatres d'upsell de Solid Security et les angles morts de Limit Login Attempts \u2014 Login Armor regroupe douze modules ind\u00e9pendants en environ un m\u00e9ga-octet.<\/p>\n\n<h4>Nouveau en 2.4.0<\/h4>\n\n<ul>\n<li><strong>Pare-feu de requ\u00eates<\/strong> : un filtre PHP optionnel, inspir\u00e9 du pare-feu 8G, qui bloque les requ\u00eates malveillantes (injection SQL, ex\u00e9cution de code, travers\u00e9e de r\u00e9pertoires, XSS, m\u00e9thodes HTTP non autoris\u00e9es) avant m\u00eame que WordPress ait fini de charger, aussi bien sur Apache que Nginx ou LiteSpeed. D\u00e9sactiv\u00e9 par d\u00e9faut, il d\u00e9marre en mode surveillance et ne filtre jamais les administrateurs connect\u00e9s ; chaque blocage est journalis\u00e9, agr\u00e9g\u00e9 en un incident par IP et par heure.<\/li>\n<li><strong>Assistant de configuration<\/strong> : \u00e0 la premi\u00e8re activation, un assistant propose une \u00ab base s\u00fbre \u00bb en un clic qui active les essentiels sans risque \u2014 un d\u00e9butant est prot\u00e9g\u00e9 en quelques secondes. Le m\u00eame bouton \u00ab Appliquer la base s\u00fbre \u00bb reste disponible \u00e0 tout moment.<\/li>\n<\/ul>\n\n<h4>Pourquoi Login Armor<\/h4>\n\n<ul>\n<li><strong>Aucun upsell, jamais.<\/strong> Pas de niveau \u00ab premium \u00bb, pas de boutons \u00ab Pro \u00bb gris\u00e9s. Tout est en GPL.<\/li>\n<li><strong>Aucun service externe \u00e0 activer.<\/strong> Pas de cl\u00e9 API, pas de tableau distant, pas de t\u00e9l\u00e9m\u00e9trie. Les seuls appels sortants sont opt-in : Have I Been Pwned (fuites\/mots de passe), Slack\/Discord\/webhook (notifications), l'API sans cl\u00e9 ipwho.is (g\u00e9olocalisation) et votre propre connecteur IA WordPress 7.<\/li>\n<li><strong>Con\u00e7u pour \u00eatre invisible.<\/strong> ZIP de moins d'un m\u00e9ga, modules charg\u00e9s \u00e0 la demande, requ\u00eates index\u00e9es \u2014 sous 2 ms sur un flux de connexion normal.<\/li>\n<li><strong>Compatible multisite, natif PHP 8.1, r\u00e9glages pr\u00eats pour la production.<\/strong> Activation r\u00e9seau d'une flotte, configuration par site, pilotage via une suite WP-CLI compl\u00e8te ; sans configuration, vous avez d\u00e9j\u00e0 80 % de la protection.<\/li>\n<\/ul>\n\n<h4>Douze modules ind\u00e9pendants<\/h4>\n\n<ol>\n<li><strong>Masquer la connexion<\/strong> : remplace wp-login.php par une URL personnalis\u00e9e (l'ancienne renvoie une 404) ; une modale de pr\u00e9-activation choisit ou g\u00e9n\u00e8re le slug et vous l'envoie par e-mail pour \u00e9viter tout verrouillage. Compatible multisite, reverse proxies et r\u00e9cup\u00e9ration de mot de passe.<\/li>\n<li><strong>Protection contre la force brute<\/strong> : verrouillages en cascade montant \u00e0 un bannissement de 24 h, blocage de sous-r\u00e9seaux et support X-Forwarded-For ; lostpassword, register, XML-RPC et l'endpoint REST users sont bloqu\u00e9s pour une IP verrouill\u00e9e, et chaque verrouillage devient un incident.<\/li>\n<li><strong>Renforcement<\/strong> : quinze bascules en un clic (r\u00e9duction de surface, identifiants, filtrage des requ\u00eates, surveillance des comptes) \u2014 d\u00e9sactiver XML-RPC\/pingbacks, l'\u00e9diteur de fichiers, l'exposition de version, les mots de passe applicatifs et l'\u00e9num\u00e9ration d'auteurs ; bloquer les identifiants r\u00e9serv\u00e9s (homoglyphes Unicode) ; ajouter un pot de miel ; \u00eatre alert\u00e9 \u00e0 la cr\u00e9ation d'un administrateur.<\/li>\n<li><strong>Authentification \u00e0 deux facteurs<\/strong> : TOTP, codes \u00e0 usage unique par e-mail et codes de secours imprimables, avec appareils de confiance 30 jours, application par r\u00f4le, p\u00e9riode de gr\u00e2ce configurable et r\u00e9cup\u00e9ration par e-mail en cas de perte.<\/li>\n<li><strong>D\u00e9tection et incidents<\/strong> : un moteur en temps r\u00e9el regroupe les \u00e9v\u00e9nements en six patterns d'attaque, chacun avec une vue d\u00e9taill\u00e9e (chronologie, IP sources, comptes cibles, s\u00e9v\u00e9rit\u00e9, empreinte UA) et des actions en un clic.<\/li>\n<li><strong>Journal d'activit\u00e9<\/strong> : piste d'audit conforme et inviolable (cha\u00eene de hachage) des actions admin sur sept domaines, avec filtrage, export CSV, r\u00e9tention configurable et transfert webhook sign\u00e9 optionnel vers un SIEM.<\/li>\n<li><strong>En-t\u00eates de s\u00e9curit\u00e9<\/strong> : CSP, X-Frame-Options, Permissions-Policy, Referrer-Policy et X-Content-Type-Options sur wp-login.php et la page de verrouillage, en deux pr\u00e9r\u00e9glages avec CSP report-uri optionnel ; les en-t\u00eates de base peuvent s'\u00e9tendre \u00e0 tout le site.<\/li>\n<li><strong>D\u00e9tection de fuites<\/strong> : rep\u00e8re les connexions avec un mot de passe fuit\u00e9 via k-anonymat sur Have I Been Pwned (seul un pr\u00e9fixe SHA-1 de 5 caract\u00e8res sort) ; v\u00e9rification e-mail XposedOrNot optionnelle, fail-soft.<\/li>\n<li><strong>Politique de mot de passe<\/strong> : impose des mots de passe forts \u00e0 l'inscription, au profil et \u00e0 la r\u00e9initialisation (longueur, classes de caract\u00e8res, interdiction de l'identifiant, rejet optionnel des mots de passe fuit\u00e9s), avec expiration optionnelle qui ne verrouille jamais personne dehors.<\/li>\n<li><strong>Gestion des sessions<\/strong> : d\u00e9connexion sur inactivit\u00e9 mesur\u00e9e sur les vrais chargements, dur\u00e9e de vie maximale ind\u00e9pendante de \u00ab se souvenir de moi \u00bb, limitation optionnelle \u00e0 un seul appareil actif, et \u00ab d\u00e9connecter tous les autres appareils \u00bb en un clic.<\/li>\n<li><strong>G\u00e9olocalisation IP<\/strong> : affiche le pays des IP attaquantes dans Incidents et \u00c9v\u00e9nements ; recherches paresseuses, cache 30 jours, plafonn\u00e9es par page, plages priv\u00e9es jamais envoy\u00e9es. ipwho.is sans cl\u00e9 par d\u00e9faut, base hors ligne possible via un filtre.<\/li>\n<li><strong>Pare-feu de requ\u00eates<\/strong> : filtre PHP optionnel inspir\u00e9 du 8G qui bloque cha\u00eenes de requ\u00eate, chemins, m\u00e9thodes HTTP et (en option) user-agents\/referrers malveillants avant le chargement de WordPress, sur Apache\/Nginx\/LiteSpeed ; d\u00e9sactiv\u00e9 par d\u00e9faut, d\u00e9marre en mode surveillance, ne filtre jamais les admins, ignore REST\/cron\/WP-CLI, allowlist IP\/chemins (CIDR). Non not\u00e9.<\/li>\n<\/ol>\n\n<h4>Briefing de s\u00e9curit\u00e9 IA (optionnel)<\/h4>\n\n<p>B\u00e2ti sur le client IA natif de WordPress 7, un clic transforme vos trente derniers jours d'activit\u00e9 en un verdict en langage clair, un panorama des IP et une courte liste d'actions prioritaires ; \u00ab Expliquer avec l'IA \u00bb fait de m\u00eame sur un incident. Le mode minimis\u00e9 (signaux anonymis\u00e9s) est par d\u00e9faut, le mode approfondi est un opt-in explicite. Aucune cl\u00e9 API stock\u00e9e : il utilise votre propre connecteur IA WordPress, le co\u00fbt et le fournisseur restent les v\u00f4tres. Il s'ouvre toujours sur un instantan\u00e9 de faits d\u00e9terministes, utile avec ou sans IA.<\/p>\n\n<h4>En plus<\/h4>\n\n<ul>\n<li><strong>Assistant de configuration<\/strong> : un assistant \u00e0 la premi\u00e8re activation propose une base s\u00fbre en un clic (Simple) ou une voie manuelle (Avanc\u00e9e) ; le bouton \u00ab Appliquer la base s\u00fbre \u00bb reste disponible, et les sites en mise \u00e0 jour ne le voient jamais.<\/li>\n<li><strong>Score de s\u00e9curit\u00e9<\/strong> : lecture pond\u00e9r\u00e9e 0-100 de votre posture avec une action prioritaire en un clic ; les fonctions d'observabilit\u00e9 (g\u00e9olocalisation, notifications, assistant IA) ne sont pas not\u00e9es.<\/li>\n<li><strong>D\u00e9tection de conflits<\/strong> : alerte quand une autre extension de s\u00e9curit\u00e9 ax\u00e9e connexion (Wordfence, Solid Security, Sucuri, All-In-One Security, SecuPress et d'autres) ou un plugin de cache (avec Hide Login actif) peut entrer en conflit.<\/li>\n<li><strong>Notifications<\/strong> : e-mail, Slack, Discord ou webhook, avec validation d'URL anti-SSRF, seuil de s\u00e9v\u00e9rit\u00e9 et rate limiting.<\/li>\n<li><strong>Suite WP-CLI<\/strong> et <strong>widget Tableau de bord<\/strong> (sparkline 14 jours, six m\u00e9triques cl\u00e9s).<\/li>\n<\/ul>\n\n<h4>Con\u00e7u par<\/h4>\n\n<p>Login Armor est con\u00e7u et maintenu par Fabrice Ducarme de <a href=\"https:\/\/wpformation.com\/login-armor\/\">WPFormation<\/a>, expert WordPress fran\u00e7ais obs\u00e9d\u00e9 par les sites propres, rapides et pr\u00eats pour l'audit. On l'utilise sur chaque site qu'on livre.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/wpformation.com\/login-armor\/\">Pr\u00e9sentation et fonctionnement de Login Armor<\/a><\/li>\n<li><a href=\"https:\/\/wpformation.com\/securite-wordpress\/\">Guides de s\u00e9curit\u00e9 WordPress<\/a> sur WPFormation<\/li>\n<li><a href=\"https:\/\/wpformation.com\/outils\/veille-securite\/\">Veille des vuln\u00e9rabilit\u00e9s WordPress<\/a> : l'outil de veille s\u00e9curit\u00e9 de WPFormation<\/li>\n<\/ul>\n\n<p>GPL pour toujours. PHP 8.1+. WordPress 6.8+. Z\u00e9ro d\u00e9pendance.<\/p>\n\n<h3>External Services<\/h3>\n\n<h4>AI Security Briefing (optional)<\/h4>\n\n<p>The AI Security Briefing and the \"Explain with AI\" incident analysis are powered by the <strong>WordPress 7 native AI Client<\/strong> (<code>wp_ai_client_prompt()<\/code>). When the administrator clicks the analysis button, LoginArmor asks WordPress to send a prompt to the <strong>AI connector that the administrator configured in their own WordPress<\/strong> (for example OpenAI, Anthropic or Google, depending on the connector). LoginArmor itself stores no API key and contacts no endpoint directly: the request, the provider and the cost are owned by the site's own AI connector.<\/p>\n\n<p>Data sent: a text prompt describing the security situation. In <strong>minimised mode (the default)<\/strong>, only anonymised, non-identifying signals are included (counts, categories, severities, role buckets) - no IP address and no username in clear. In <strong>deep mode<\/strong> (an explicit, off-by-default opt-in), the prompt additionally includes real IP addresses and event details so the analysis can name specific sources. No data is ever sent unless the administrator clicks the analysis button.<\/p>\n\n<p>This feature is inactive unless WordPress 7 (or the AI Building Blocks feature plugin) is present with a configured, approved AI connector. The applicable terms and privacy policy are those of the AI provider the administrator chose for their connector; please refer to that provider's documentation.<\/p>\n\n<h4>Webhook Notifications (optional)<\/h4>\n\n<p>When explicitly enabled and configured by the administrator in LoginArmor &gt; Settings &gt; Notifications, the plugin sends incident data to third-party services via webhooks.<\/p>\n\n<p>Data sent: incident type, severity level, IP address, target username, event count, and site URL.<\/p>\n\n<p>No data is sent unless the administrator actively enables and configures a notification channel.<\/p>\n\n<ul>\n<li><strong>Slack<\/strong> - <a href=\"https:\/\/slack.com\/terms-of-service\">Terms of Service<\/a> | <a href=\"https:\/\/slack.com\/privacy-policy\">Privacy Policy<\/a><\/li>\n<li><strong>Discord<\/strong> - <a href=\"https:\/\/discord.com\/terms\">Terms of Service<\/a> | <a href=\"https:\/\/discord.com\/privacy\">Privacy Policy<\/a><\/li>\n<li><strong>Custom Webhook URL<\/strong> - User-configured endpoint (administrator's responsibility)<\/li>\n<\/ul>\n\n<h4>Gravatar (Automattic)<\/h4>\n\n<p>The Activity Log tab uses WordPress core's <code>get_avatar()<\/code> function to display user avatars. WordPress may send a hashed email address to <a href=\"https:\/\/gravatar.com\/\">Gravatar<\/a> servers to retrieve avatar images. This is controlled by Settings &gt; Discussion &gt; Avatars.<\/p>\n\n<ul>\n<li><strong>Gravatar<\/strong> - <a href=\"https:\/\/automattic.com\/tos\/\">Automattic Terms of Service<\/a> | <a href=\"https:\/\/automattic.com\/privacy\/\">Privacy Policy<\/a><\/li>\n<\/ul>\n\n<h4>Breach Check - Have I Been Pwned (optional)<\/h4>\n\n<p>When the administrator explicitly enables the <strong>Breach Check<\/strong> module (LoginArmor &gt; Settings &gt; Breach  &hellip;<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>login-armor<\/code> directory to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Go to LoginArmor in the admin menu to configure<\/li>\n<\/ol>\n\n<p>For multisite: Network Activate the plugin to apply it across all sites.<\/p>\n\n<h4>Setting up Hide Login<\/h4>\n\n<ol>\n<li>Go to LoginArmor &gt; Settings &gt; Hide Login section<\/li>\n<li>Enter your desired login slug (e.g., <code>my-login<\/code>)<\/li>\n<li>Save settings<\/li>\n<li><strong>Bookmark your new login URL<\/strong>: you will need it to access your admin<\/li>\n<\/ol>\n\n<h4>Recovering access<\/h4>\n\n<p>If you forget your custom login URL:<\/p>\n\n<ul>\n<li>Use the recovery email feature (configurable in settings)<\/li>\n<li>Connect to your database and delete the <code>login_armor_hide_slug<\/code> row from the <code>wp_options<\/code> table<\/li>\n<li>Use WP-CLI: <code>wp option delete login_armor_hide_slug<\/code><\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20lock%20me%20out%20of%20my%20own%20site%3F\"><h3>Will it lock me out of my own site?<\/h3><\/dt>\n<dd><p>No. Hide Login always sends a one-time recovery URL to the admin email. If you lose the slug, check your inbox. The plugin also honors <code>wp-cli<\/code> fallback so you can reset anything from SSH.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20my%20site%20down%3F\"><h3>Does it slow my site down?<\/h3><\/dt>\n<dd><p>No. Everything is lazy-loaded and indexed. On a normal login flow the extra SQL cost is under 2 ms.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20cloudflare%20%2F%20reverse%20proxies%3F\"><h3>Is it compatible with Cloudflare \/ reverse proxies?<\/h3><\/dt>\n<dd><p>Yes. IP detection honors trusted <code>X-Forwarded-For<\/code> headers; you pick the header in Settings.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20multisite%3F\"><h3>Does it work with multisite?<\/h3><\/dt>\n<dd><p>Yes, subdomain and subfolder. Each site has its own modules, logs, and thresholds.<\/p><\/dd>\n<dt id=\"can%20i%20use%20loginarmor%20alongside%20wordfence%20%2F%20ithemes%20security%20%2F%20solid%20security%3F\"><h3>Can I use LoginArmor alongside Wordfence \/ iThemes Security \/ Solid Security?<\/h3><\/dt>\n<dd><p>Yes, but disable overlapping modules on one side to avoid double lockouts.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>Three custom tables in your own database: events, incidents, activity. Nothing leaves your server.<\/p><\/dd>\n<dt id=\"how%20do%20i%20migrate%20my%20configuration%3F\"><h3>How do I migrate my configuration?<\/h3><\/dt>\n<dd><p>Settings are plain WordPress options. Export\/import via WP-CLI or any standard options-sync tool.<\/p><\/dd>\n<dt id=\"is%20there%20a%20pro%20version%3F\"><h3>Is there a pro version?<\/h3><\/dt>\n<dd><p>Not currently. LoginArmor is fully free and open source. GPL forever.<\/p><\/dd>\n<dt id=\"where%20can%20i%20report%20bugs%20or%20request%20features%3F\"><h3>Where can I report bugs or request features?<\/h3><\/dt>\n<dd><p>Support forum: <a href=\"https:\/\/wordpress.org\/support\/plugin\/login-armor\/\">wordpress.org\/support\/plugin\/login-armor\/<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.4.0<\/h4>\n\n<p>Feature release - request firewall, guided onboarding, fuller in-app docs.<\/p>\n\n<ul>\n<li>New - <strong>Request Firewall<\/strong> (optional, off by default): a PHP \"8G\"-style filter that blocks malicious query strings, paths and HTTP methods before WordPress fully loads (Apache\/Nginx\/LiteSpeed\/IIS). Starts in monitor mode; admins, REST, cron, WP-CLI and admin-ajax are never filtered; IP\/path allowlist (CIDR); blocks aggregate to one incident per IP per hour.<\/li>\n<li>New - <strong>Onboarding wizard<\/strong> with a one-click safe baseline (Simple) or manual setup (Advanced), plus a permanent \"Apply safe baseline\" button. Upgrading sites see no change.<\/li>\n<li>Improvement - Granular security-plugin conflict warnings, a cache-plugin warning when Hide Login is on, and contextual help for the modules added since 2.2.0.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<p>Feature release - account-security hardening.<\/p>\n\n<ul>\n<li>New - <strong>Password Policy<\/strong>: minimum length and character-class rules, forbid the username in the password, optionally reject breached passwords (privacy-preserving HIBP), optional non-locking expiration.<\/li>\n<li>New - <strong>Session Management<\/strong>: idle timeout, maximum session lifetime, optional single active device, and \"sign out all other devices\".<\/li>\n<li>New - <strong>IP Geolocation<\/strong> (opt-in): country next to IPs on Incidents\/Events; lazy, cached, private ranges never sent (see External Services).<\/li>\n<li>Improvement - Score now accounts for Password Policy and Session Management; baseline headers can apply site-wide; every IP lockout creates an incident. New hardening: disable pingbacks, alert on new admin.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<p>Feature release - the AI Security Briefing.<\/p>\n\n<ul>\n<li>New - <strong>AI Security Briefing<\/strong> on the Overview: one click turns your last 30 days of activity into a plain-language verdict, an IP picture and prioritised actions. Built on the WordPress 7 native AI Client - uses your own connector, stores no API key, runs only on click. Always leads with a deterministic facts snapshot (with or without AI); plus \"Explain with AI\" on an incident.<\/li>\n<li>Privacy - Minimised mode (anonymised signals) is the default; deep mode (real IPs) is an explicit opt-in. See External Services.<\/li>\n<\/ul>\n\n<h4>2.1.26<\/h4>\n\n<p>Fix: email\/backup 2FA bouncing to \"session expired\" on browsers that don't return the verification cookie; the form now also carries the session token. Security unchanged.<\/p>\n\n<h4>2.1.25<\/h4>\n\n<p>Fix: email\/backup two-factor verification rejected in some browsers (notably Chrome); the form is now uncached and authenticated by the signed same-site cookie.<\/p>\n\n<h4>2.1.24<\/h4>\n\n<p>Fix: fatal error during authenticator-app setup on hosts whose wp-config.php does not define AUTH_KEY (e.g. some Infomaniak installs). Existing setups unaffected.<\/p>\n\n<h4>2.1.23<\/h4>\n\n<p>Fix: 2FA login screen - \"use a different method\" links now work, expired\/locked sessions explain themselves, and the setup button reports errors.<\/p>\n\n<h4>2.1.22<\/h4>\n\n<p>Fix: the Security Score now counts default-on modules (Brute Force, Detection). Display and scoring only.<\/p>\n\n<h4>2.1.21<\/h4>\n\n<p>Cleaner user-agent labels in the Events table.<\/p>\n\n<h4>2.1.20<\/h4>\n\n<p>Migration-aware Activity Log integrity (amber \"Keys changed\" instead of a false TAMPERED alarm), an XML-RPC blind-spot warning, and a complete French translation.<\/p>\n\n<h4>2.1.19<\/h4>\n\n<p>Clearer attack-type labels on incidents, translatable admin toasts, French translation of the visible tabs, and an integrity-badge verify fix.<\/p>\n\n<h4>2.1.18<\/h4>\n\n<p>Fix: bulk actions now work when incidents are all resolved; the attack-vector pill shows only for XML-RPC\/REST.<\/p>\n\n<h4>2.1.17<\/h4>\n\n<p>Incidents now record and show the attack vector (XML-RPC \/ REST \/ login form) and support bulk resolve\/ignore.<\/p>\n\n<h4>2.1.16<\/h4>\n\n<p>Plain-permalink fixes (Hide Login URL, REST allowlist), activity-log coverage for 2FA\/registration\/reset, and Honeypot on WooCommerce and frontend forms.<\/p>\n\n<h4>2.1.15<\/h4>\n\n<p>Fix: fatal TypeError when plugins (e.g. WP Fastest Cache) call WordPress URL builders with off-contract argument types.<\/p>\n\n<h4>2.1.14<\/h4>\n\n<p>Fix: the prevent_author_enum toggle no longer blocks the legitimate ?author=N filter in the wp-admin Posts\/Pages lists.<\/p>\n\n<h4>2.1.13<\/h4>\n\n<p>Fix: silent 2FA failure on non-trailing-slash permalinks (e.g. \/%postname%) - the verify cookie path mismatched the request path.<\/p>\n\n<h4>2.1.12 and earlier<\/h4>\n\n<p>Bug fixes, security hardening and i18n across the 2.1.x and 2.0.x series (Hide Login host-awareness, CSP, lockout delivery, REST scope, IPv6, HTTP\/2, Activity Log integrity), through the initial 2.0.0 release. Full per-version notes: CHANGELOG.md in the plugin folder.<\/p>","raw_excerpt":"Twelve security modules + AI briefing: hide login, request firewall, brute force, 2FA, password policy, sessions, hardening, audit log. No upsells.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/301525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=301525"}],"author":[{"embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpformation"}],"wp:attachment":[{"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=301525"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=301525"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=301525"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=301525"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=301525"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/da.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=301525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}