{"id":371092,"date":"2026-10-11T17:56:17","date_gmt":"2026-10-11T17:56:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/total-security-wp\/"},"modified":"2026-10-11T17:55:44","modified_gmt":"2026-10-11T17:55:44","slug":"loyal-security","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/loyal-security\/","author":23567994,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.1","stable_tag":"1.5.1","tested":"7.1.3","requires":"6.6","requires_php":"8.0","requires_plugins":null,"header_name":"Loyal Security - Firewall & Malware Scanner","header_author":"Loyal Security","header_description":"All-in-one WordPress security: dual-mode firewall (WAF), hardening, malware scanner and file integrity monitoring, incident response, two-factor login, backups and audit log.","assets_banners_color":"293544","last_updated":"2026-10-11 17:55:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/loyalsecuritywp.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":59,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.1":{"tag":"1.5.1","author":"totalsecuritywp","date":"2026-10-11 17:55:44","revision":3739910}},"upgrade_notice":{"1.5.1":"<p>Stops firewall false positives on checkouts, forms, webhooks and editors&#039; posts, and no longer blocks common integrations and SEO tools by default. Recommended for all users.<\/p>","1.5.0":"<p>Fixes stale files behind CDNs, real visitor addresses behind Cloudflare, country blocking without a CDN, two-factor sign-in counted as failures, and wider malware and database scanning. Recommended for all users.<\/p>","1.4.11":"<p>Fixes backups of data containing the % character, restores the weekly automatic scan, and removes every feature limit. Requires WordPress 6.6. Recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3739917,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3739917,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3739917,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3739917,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3739912,"resolution":"1","location":"assets","locale":"","width":1600,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3739912,"resolution":"2","location":"assets","locale":"","width":1600,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3739912,"resolution":"3","location":"assets","locale":"","width":1600,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3739912,"resolution":"4","location":"assets","locale":"","width":1600,"height":1000}},"screenshots":{"1":"Dashboard overview with the admin-bar Security Score and at-a-glance module status.","2":"Firewall panel \u2014 web application firewall, sign-in lockout, bot management and active virtual patches.","3":"Malware scanner \u2014 findings list with one-click quarantine and repair.","4":"Live Traffic monitor \u2014 real-time request feed with user-agent classification."}},"plugin_section":[],"plugin_tags":[1174,55021,600,1909,18199],"plugin_category":[54],"plugin_contributors":[285881],"plugin_business_model":[],"class_list":["post-371092","plugin","type-plugin","status-publish","hentry","plugin_tags-firewall","plugin_tags-malware-scanner","plugin_tags-security","plugin_tags-two-factor-authentication","plugin_tags-waf","plugin_category-security-and-spam-protection","plugin_contributors-totalsecuritywp","plugin_committers-totalsecuritywp"],"banners":{"banner":"https:\/\/ps.w.org\/loyal-security\/assets\/banner-772x250.png?rev=3739917","banner_2x":"https:\/\/ps.w.org\/loyal-security\/assets\/banner-1544x500.png?rev=3739917","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/loyal-security\/assets\/icon-128x128.png?rev=3739917","icon_2x":"https:\/\/ps.w.org\/loyal-security\/assets\/icon-256x256.png?rev=3739917","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/loyal-security\/assets\/screenshot-1.png?rev=3739912","caption":"Dashboard overview with the admin-bar Security Score and at-a-glance module status."},{"src":"https:\/\/ps.w.org\/loyal-security\/assets\/screenshot-2.png?rev=3739912","caption":"Firewall panel \u2014 web application firewall, sign-in lockout, bot management and active virtual patches."},{"src":"https:\/\/ps.w.org\/loyal-security\/assets\/screenshot-3.png?rev=3739912","caption":"Malware scanner \u2014 findings list with one-click quarantine and repair."},{"src":"https:\/\/ps.w.org\/loyal-security\/assets\/screenshot-4.png?rev=3739912","caption":"Live Traffic monitor \u2014 real-time request feed with user-agent classification."}],"raw_content":"<!--section=description-->\n<p>Loyal Security - Firewall &amp; Malware Scanner is an all-in-one WordPress security suite: a dual-mode web application\nfirewall, malware scanner with file integrity monitoring, server hardening, two-factor\nauthentication, backups, and audit logging \u2014 in a single self-contained plugin.<\/p>\n\n<p>Every protection runs on your own server with the rules bundled in the plugin. No Node.js, no\nbuild step: the admin dashboard is a React app powered by WordPress core's own bundled\n    wp-element, and every PHP class is loaded by a built-in autoloader. Install it, activate it,\nand it works. A small number of features use outside services; each one is listed under\n\"External services\" below, with what it sends and how to switch it off.<\/p>\n\n<p><strong>Everything in this plugin is free and fully functional \u2014 nothing is locked, limited or\ntime-restricted.<\/strong> Loyal Security Pro is a separate plugin, sold and downloaded from our\nwebsite, that adds automation and agency tools on top.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Web Application Firewall<\/strong> \u2014 Optimized Mode (runs before WordPress even loads, via a\nlightweight prepend) or Standard Mode (runs inside WordPress). Blocks SQL injection, XSS,\nLFI\/RFI, path traversal, and RCE.<\/li>\n<li><strong>Rate limiting, brute-force protection &amp; DDoS shielding<\/strong> \u2014 plus a bad-bot blocker and\ncountry-level geo-blocking that works with or without a CDN (bundled IP-to-country data,\nno outside lookups).<\/li>\n<li><strong>Virtual patching<\/strong> \u2014 shields known-vulnerable third-party plugins\/themes until you're\nable to update them.<\/li>\n<li><strong>Deep system hardening<\/strong> \u2014 .htaccess\/Nginx rule generation, wp-config hardening,\ndirectory-browsing lockdown, REST API &amp; XML-RPC restriction, version obfuscation.<\/li>\n<li><strong>Malware scanner<\/strong> \u2014 heuristic regex + token-based detection engine, on-demand full-site\nscans, and a weekly automatic scan.<\/li>\n<li><strong>File integrity monitoring<\/strong> \u2014 WordPress.org checksum verification for core and plugins,\nplus baseline diffing for everything else, including themes, mu-plugins and drop-ins.<\/li>\n<li><strong>Database scanner<\/strong> \u2014 checks posts, page-builder content, category descriptions, comments,\noptions, user meta and code-snippet plugins for injected scripts (including scripts loaded\nfrom outside hosts), spam links, a hijacked site address and rogue admin accounts.<\/li>\n<li><strong>Incident response<\/strong> \u2014 safe quarantine, one-click clean-file recovery, and file-permission\nreset.<\/li>\n<li><strong>Backup &amp; restore<\/strong> \u2014 on-demand and scheduled full-site backups (files + database), plus a\ndownloadable recovery tool you can upload to restore a backup even if WordPress itself won't\nload.<\/li>\n<li><strong>Two-factor authentication<\/strong> \u2014 TOTP with QR enrollment and backup codes, passkeys, login\nCAPTCHA, password policy, breached-password checking, and active-session management.<\/li>\n<li><strong>Audit log<\/strong> \u2014 full event trail with IP\/user\/proxy tracking, configurable retention\n(90 days by default), and CSV export.<\/li>\n<li><strong>Email notifications<\/strong> \u2014 alerts with human-readable event guidance, throttling, quiet\nhours and per-event muting.<\/li>\n<li><strong>Live Traffic monitor<\/strong> \u2014 real-time request feed with user-agent classification, filters,\nand one-click block\/unblock.<\/li>\n<li><strong>Content Security Policy manager<\/strong> \u2014 builds a policy from the resources your site\nactually loads, with a report-only mode.<\/li>\n<li><strong>Admin-bar Security Score<\/strong> \u2014 an at-a-glance A\u2013F health grade.<\/li>\n<li><strong>Inline vulnerability notices<\/strong> \u2014 flags installed plugins\/themes with known CVEs directly\non the Plugins, Themes, and Updates screens.<\/li>\n<li><strong>WP-CLI support<\/strong> \u2014 <code>wp loyal-security status | scan | firewall | backup | twofa<\/code>.<\/li>\n<\/ul>\n\n<h4>Loyal Security Pro<\/h4>\n\n<p>Loyal Security Pro is a separate plugin for people running security across many sites. It is\nnot needed for anything listed above. It adds:<\/p>\n\n<ul>\n<li><strong>Hourly threat-intelligence updates<\/strong> \u2014 the same feed, delivered every hour instead of twice\na day.<\/li>\n<li><strong>Under Attack Mode<\/strong> \u2014 a one-click emergency shield with automatic expiry.<\/li>\n<li><strong>Faster scheduled scans &amp; auto-quarantine<\/strong> \u2014 daily or twice-daily scans, and infected files\nisolated the moment they are found.<\/li>\n<li><strong>Sentinel AI<\/strong> \u2014 AI-assisted review of suspicious activity with reversible responses.<\/li>\n<li><strong>Threat hunting, uptime monitoring and compliance reports.<\/strong><\/li>\n<li><strong>Webhook, PagerDuty and OpsGenie alerts, and Cloudflare edge sync.<\/strong><\/li>\n<li><strong>WooCommerce-aware backups and staging restores.<\/strong><\/li>\n<li><strong>Agency tooling<\/strong> \u2014 white-label dashboard, role management, and multi-site hub.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>Loyal Security connects to the services below. Nothing else is contacted, and no request\ncarries your site's URL, your visitors' personal data, or your content unless stated here.\nRequests the plugin makes identify themselves as <code>LoyalSecurity\/&lt;version&gt;<\/code> instead of\nWordPress's default user agent (which includes the site's URL).<\/p>\n\n<h4>Loyal Security threat-intelligence service (licensekit.loyalsecuritywp.com)<\/h4>\n\n<p>Our own service, used for:<\/p>\n\n<ul>\n<li><strong>Threat-intelligence feed (on by default).<\/strong> Keeps the firewall rules, malware signatures,\nvirtual patches and the vulnerability (CVE) database up to date. Twice a day, and when you\nclick \"Sync now\", the plugin requests each dataset and sends: the dataset name, the version\nit already has, the feed channel (\"free\", or \"pro\" with the separate Pro plugin), the\nsubscription key if Pro stored one, and \u2014 for the vulnerability dataset only \u2014 the slugs (folder names) of the\ninstalled plugins and themes, so only advisories that concern them are returned. Switch\nautomatic updates off with Settings \u2192 Threat Intelligence \u2192 \"Auto Sync\", or turn the module\noff with \"Enabled\"; the plugin then keeps using the rules it already has.<\/li>\n<li><strong>Pricing on the \"About Pro\" screen.<\/strong> Opening that screen fetches the public plan list. No\nsite data is sent.<\/li>\n<li><strong>Connection test.<\/strong> Only when you click \"Test connection\" on the Threat Intelligence\nscreen: sends a timestamp, an anonymous install ID and, if present, a hash of the\nsubscription key.<\/li>\n<li><strong>Firewall-bypass reports and virtual-patch suggestions (off by default).<\/strong> Only after an\nadministrator gives explicit consent (Loyal Security \u2192 Bypass Telemetry in the Advanced view,\nwhere it can be withdrawn at any time): when an attack appears to have got past the firewall, the plugin\nsends the attacker's request (method, path, parameters, IP address and country), the matching\nrule names, the plugin\/WordPress\/PHP versions (major.minor) and an anonymous install ID \u2014\nwith cookies, authorization headers and nonces removed. With the same consent, a virtual\npatch you approve can be shared as a rule suggestion.<\/li>\n<\/ul>\n\n<p>Terms of use: https:\/\/loyalsecuritywp.com\/terms.html \u2014 Privacy policy: https:\/\/loyalsecuritywp.com\/privacy.html<\/p>\n\n<h4>Have I Been Pwned \u2014 Pwned Passwords (api.pwnedpasswords.com)<\/h4>\n\n<p><strong>On by default.<\/strong> When a user logs in, the plugin checks whether the password appears in known\ndata breaches, using k-anonymity: only the first five characters of the password's SHA-1 hash\nare sent \u2014 never the password, the username or the email address. It never blocks a login; the\nuser sees a warning. Switch it off with Settings \u2192 Identity &amp; Access \u2192 \"Breach Check\".<\/p>\n\n<p>Terms of use: https:\/\/haveibeenpwned.com\/TermsOfUse \u2014 Privacy policy: https:\/\/haveibeenpwned.com\/Privacy<\/p>\n\n<h4>Cloudflare Turnstile (challenges.cloudflare.com)<\/h4>\n\n<p>Only if you choose Turnstile as the login CAPTCHA and enter your keys. The Turnstile script\nloads on the login form, and on submission the visitor's CAPTCHA token and IP address are sent\nto Cloudflare to verify it.<\/p>\n\n<p>Terms of use: https:\/\/www.cloudflare.com\/website-terms\/ \u2014 Privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/ \u2014 Turnstile privacy addendum: https:\/\/www.cloudflare.com\/turnstile-privacy-policy\/<\/p>\n\n<h4>Google reCAPTCHA (www.google.com)<\/h4>\n\n<p>Only if you choose reCAPTCHA v3 as the login CAPTCHA and enter your keys. The reCAPTCHA script\nloads on the login form, and on submission the visitor's CAPTCHA token and IP address are sent\nto Google to verify it.<\/p>\n\n<p>Terms of service: https:\/\/policies.google.com\/terms \u2014 Privacy policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Google Safe Browsing (safebrowsing.googleapis.com)<\/h4>\n\n<p>Only if you enter your own Safe Browsing API key (Settings \u2192 Hardening). The plugin then sends\nyour site's home URL to check whether Google has flagged it. Nothing is sent without a key.<\/p>\n\n<p>Terms of service: https:\/\/developers.google.com\/terms \u2014 Privacy policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>WordPress.org (api.wordpress.org, downloads.wordpress.org, core.svn.wordpress.org)<\/h4>\n\n<p>File integrity checks download the official checksums of WordPress core and of the installed\nWordPress.org plugins (plugin slug and version). When you choose to repair or reinstall, the\nofficial WordPress core or plugin package, or a single core file, is downloaded. These are the\nsame public services WordPress uses for updates.<\/p>\n\n<p>File Integrity Monitoring is on by default and its check also runs on a weekly schedule, so\nthese checksums are fetched automatically as well as when you start a check yourself. Switch\nthe automatic run off in Settings \u2192 File Integrity Monitoring (the scheduled check, or the\nwhole module).<\/p>\n\n<p>Privacy policy: https:\/\/wordpress.org\/about\/privacy\/ \u2014 WordPress.org does not publish a separate\nterms of service for these endpoints; they are the same public APIs WordPress core itself uses,\nand the software is governed by the GPL: https:\/\/wordpress.org\/about\/license\/<\/p>\n\n<h4>Stylesheets your pages already load (CSP scanner)<\/h4>\n\n<p>Only when an administrator clicks \"Scan\" on the Content Security Policy screen. To suggest\nwhich domains your policy should allow, the scanner loads a few of your own pages and the\nexternal stylesheets those pages already use (for example a Google Fonts or CDN stylesheet),\nwith a plain request that carries no site data. Those providers' own terms apply to those\nfiles, exactly as when a visitor loads your site.<\/p>\n\n<h4>DNS (your server's resolver)<\/h4>\n\n<p>To confirm that a visitor claiming to be a search-engine crawler (Googlebot, Bingbot\u2026) really\nis one, the plugin performs a reverse and forward DNS lookup of that visitor's IP address\nthrough your server's normal DNS resolver. The result is cached.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>loyal-security<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it directly from\n<strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Loyal Security<\/strong> in the admin menu and run the Setup Wizard \u2014 it deploys the\nfirewall in the best mode for your hosting environment automatically.<\/li>\n<li>Review the defaults under <strong>Loyal Security \u2192 Settings<\/strong>, and enable two-factor\nauthentication for every admin account.<\/li>\n<\/ol>\n\n<p><strong>Server requirements:<\/strong> PHP 8.0 or later. Optimized Mode (recommended) needs either\n    auto_prepend_file support (mod_php\/CGI) or a writable <code>.user.ini<\/code> (PHP-FPM). Where neither\nis available, the firewall automatically falls back to Standard Mode \u2014 no manual\nconfiguration required.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20node.js%20or%20a%20build%20step%3F\"><h3>Does this require Node.js or a build step?<\/h3><\/dt>\n<dd><p>No. The dashboard uses WordPress's bundled React via ES modules, so there's nothing to\ncompile \u2014 and no Composer install either, since the plugin ships its own lightweight\nautoloader.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20both%20block%20and%20classic%20themes%3F\"><h3>Does it work with both block and classic themes?<\/h3><\/dt>\n<dd><p>Yes. The dashboard lives entirely in wp-admin, so it's completely independent of your active\ntheme.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>Optimized Mode runs the firewall before WordPress even loads, so malicious requests are\nblocked before the WordPress bootstrap, database connection, or plugin\/theme loading happen.\nStandard Mode, used automatically when the prepend can't be deployed, still runs as early as\npossible inside WordPress.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20firewall%20itself%20breaks%3F\"><h3>What happens if the firewall itself breaks?<\/h3><\/dt>\n<dd><p>The Optimized Mode prepend is written to fail open: if its configuration or any of its files\nare missing or unreadable, it does nothing rather than breaking the site. The Setup Wizard\nalso self-tests the deployment and automatically rolls back if the test fails.<\/p><\/dd>\n<dt id=\"is%20anything%20in%20this%20plugin%20limited%20or%20locked%3F\"><h3>Is anything in this plugin limited or locked?<\/h3><\/dt>\n<dd><p>No. Every feature in this plugin is complete and has no time, usage or licence limits.\nLoyal Security Pro is a separate plugin that adds its own features (listed above); installing\nit unlocks nothing in this one.<\/p><\/dd>\n<dt id=\"which%20outside%20services%20does%20the%20plugin%20contact%3F\"><h3>Which outside services does the plugin contact?<\/h3><\/dt>\n<dd><p>By default, three: our threat-intelligence feed (twice a day, to keep the firewall and scanner\nrules current), Have I Been Pwned's Pwned Passwords range API (at login, k-anonymous), and\nWordPress.org's own checksum service (with the weekly file-integrity check, the same service\nWordPress uses for updates). All three can be switched off in Settings. Everything else \u2014\nCAPTCHA, Safe Browsing, bypass reports, the CSP scanner \u2014 is off until you enable it or click\nit. See \"External services\" above for exactly what each one sends.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20alongside%20another%20security%20plugin%3F\"><h3>Can I use this alongside another security plugin?<\/h3><\/dt>\n<dd><p>You can, but running two firewalls or two file scanners at once is generally redundant and\ncan occasionally conflict (for example, both plugins trying to write competing rules to\n.htaccess). We recommend deactivating other firewall plugins before activating Loyal\nSecurity's.<\/p><\/dd>\n<dt id=\"can%20i%20bring%20my%20ip%20block%20and%20allow%20lists%20over%20from%20another%20security%20plugin%3F\"><h3>Can I bring my IP block and allow lists over from another security plugin?<\/h3><\/dt>\n<dd><p>Yes. If Wordfence, Sucuri Security or iThemes\/Solid Security is or has been installed on the\nsite, Loyal Security can read the IP block and allow lists those plugins stored in your own\ndatabase, so you do not have to type them in again. It only ever reads, never writes to or\nchanges the other plugin's data, nothing is sent anywhere, and it runs only when an\nadministrator starts it from the Firewall screen. Those product names are used here solely to\nidentify whose stored lists are being read; Loyal Security is not affiliated with, endorsed by,\nor connected to any of them.<\/p><\/dd>\n<dt id=\"where%20do%20i%20report%20a%20security%20vulnerability%20in%20the%20plugin%20itself%3F\"><h3>Where do I report a security vulnerability in the plugin itself?<\/h3><\/dt>\n<dd><p>Please report it privately rather than in the public support forum so it can be fixed before\ndetails become public.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>By default, deleting Loyal Security keeps your security data (logs, scan history, settings)\nin the database in case you reinstall it. Any deployed server-level changes \u2014 the firewall\nprepend, .htaccess rules, wp-config markers \u2014 are always reverted on delete regardless. If you\nwant a full data wipe instead, enable \"Delete all data on uninstall\" under Settings before\nremoving the plugin.<\/p><\/dd>\n<dt id=\"where%20does%20the%20country%20data%20come%20from%3F\"><h3>Where does the country data come from?<\/h3><\/dt>\n<dd><p>Country rules use the visitor's country from Cloudflare (when your site is behind Cloudflare)\nor from a trusted proxy you configured. Otherwise they look the address up in a table bundled\nwith the plugin: <a href=\"https:\/\/db-ip.com\">IP Geolocation by DB-IP<\/a>, \"IP to Country Lite\", licensed\nunder <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">CC BY 4.0<\/a> and converted to a compact\nlookup format (details in <code>data\/geo\/NOTICE.txt<\/code>). The table is updated with each plugin release,\nand looking an address up never contacts any outside service.<\/p>\n\n<p>The plugin's admin screens, and notification emails that include a country, link to DB-IP as its\nlicence asks. The page a visitor sees when a country rule blocks them can show the same link: turn\non \"geo credit on block page\" in the Firewall settings. It is off by default because a plugin may\nnot add links to your public site without your consent.<\/p><\/dd>\n<dt id=\"does%20it%20work%20behind%20cloudflare%3F\"><h3>Does it work behind Cloudflare?<\/h3><\/dt>\n<dd><p>Yes. Requests that come from Cloudflare's published addresses are recognised automatically, so\nbans, rate limits and logs use the real visitor's address (\"Trust Cloudflare\", on by default).\nCloudflare's own addresses are never banned or allowlisted. For another proxy or load balancer,\nadd its address under Firewall \u2192 Trusted proxies.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fix: The firewall no longer blocks everyday text. Order notes, addresses, contact-form messages and reviews with ordinary words such as \"select\", \"drop it from\", \"#5 and 6\" or \"-- or call me\" were scored as SQL injection, and the same text was counted twice, so WooCommerce checkouts, payment webhooks and even GDPR requests could be refused. Each rule now counts once per request and matches real SQL syntax only. Detection of real attacks improved at the same time.<\/li>\n<li>Fix: Administrators and editors are no longer blocked for saving posts with embeds or scripts, in Standard and Optimized Mode. Optimized Mode recognises them through a signed cookie set when they sign in.<\/li>\n<li>Fix: Integrations that sign in with an application password or a WooCommerce API key (mobile apps, Zapier, inventory and accounting tools) are judged after WordPress checks the credentials, so an administrator's API calls are no longer blocked.<\/li>\n<li>Change: curl, python-requests and Go HTTP clients, and SEO crawlers (Ahrefs, Semrush, Majestic, Moz, Petal), are no longer blocked by default: payment webhooks, integrations and your own SEO tools use them. Both groups can be blocked under Firewall &gt; Blocked Bot Groups. Vulnerability scanners are still always blocked, and Optimized Mode now enforces the bad-bot list too.<\/li>\n<li>Fix: The query-string limiter counts only page views by visitors who are not signed in, ignores AJAX and REST calls and tracking parameters (utm_*, gclid, fbclid), and allows 120 combinations per 10 minutes instead of 60. A shopper using product filters was rate-limited after about 30 clicks.<\/li>\n<li>Fix: Author archives are public again for authors who have published posts; only empty archives answer 404. Editors and authors can use the block editor's author picker and author filters again.<\/li>\n<li>Fix: Redirects to other sites are blocked only when the destination came from the request itself (a real open redirect). Payment pages, Google, Jetpack, PayPal and Stripe sign-in, and redirect rules you created were being sent to the home page.<\/li>\n<li>Fix: The Permissions-Policy header allows location, camera and microphone for your own pages (store locators, \"use my location\") and still denies them to embedded third-party frames.<\/li>\n<li>Fix: With Jetpack active, XML-RPC stays reachable because Jetpack needs it; pingbacks and system.multicall stay disabled.<\/li>\n<li>Fix: Sites that serve languages or stores on several domains (WPML, Polylang, domain mapping) are no longer redirected to the main domain.<\/li>\n<li>Fix: Too many failed sign-ins now lock sign-in only, not the whole site, so a customer who forgot a password can still browse and check out (and so can everyone else behind the same office or mobile network). Only clearly automated guessing (four times the limit in one window) still bans the address. Failures before your last successful sign-in no longer count, the default limit is 5 attempts, and the lockout message is shown on wp-login and WooCommerce's account page.<\/li>\n<li>Fix: A sign-in lockout now really stops sign-in. WordPress signed the user in anyway when the password was right, because the check ran before WordPress's own.<\/li>\n<li>Change: Email alerts no longer go out for routine events the firewall already handled: blocked attacks and bots, rate limits, single failed sign-ins, author and XML-RPC probes, honeypot hits. They are still logged and shown on the dashboard, and each can be switched back on under Notifications &gt; Muted. Alerts that need you (lockouts, attacks on a vulnerable plugin, changed files, new administrators, malware) are unchanged.<\/li>\n<li>Fix: Busy shops and newsletters no longer trigger a warning for every email above 10 a minute; one notice is logged when 30 a minute is crossed. Bursts of comments are logged once per burst.<\/li>\n<li>Fix: After WordPress updates a plugin or theme whose files you snapshotted for integrity monitoring, the snapshot is refreshed, so legitimate updates are no longer reported as modified files. The same open finding is no longer added again on every check, and the alert is sent only when something new is found.<\/li>\n<li>Fix: Files that Koko Analytics and Wordfence place in the WordPress root are no longer reported as unexpected while those plugins are installed.<\/li>\n<li>Fix: Optimized Mode no longer takes over the PHP prepend setting when another firewall (for example Wordfence's Extended Protection) or your host already uses it, which switched the other one off. Loyal Security stays in Standard Mode and explains why.<\/li>\n<li>Fix: Optimized Mode on Apache no longer adds a host-redirect rule to .htaccess; it could redirect extra domains and loop when the WordPress address and site address use different hosts.<\/li>\n<li>Security: On multisite, only super admins can manage Loyal Security. Site administrators could previously reach settings that change files shared by the whole network (.htaccess, .user.ini, wp-config.php), take backups of the whole network's database and repair or quarantine files anywhere.<\/li>\n<li>Fix: On multisite, \"Delete all data on uninstall\" now removes every site's tables, settings and stored files, not only the main site's.<\/li>\n<li>Fix: Behind a proxy or load balancer that is not in Trusted proxies (a container ingress, nginx in front of Apache), every visitor shares the proxy's internal address. Bans, rate limits and sign-in lockouts are no longer applied to that shared address, and it is never allowlisted when an administrator signs in; the existing notice still asks you to add the proxy. Content inspection is unchanged.<\/li>\n<li>Fix: The firewall now inspects requests in WordPress Playground, including the Live Preview on WordPress.org. Playground runs PHP in command-line mode, which the firewall mistook for WP-CLI.<\/li>\n<li>Fix: Behind a trusted proxy on the same server (nginx in front of Apache, Varnish), visitors are no longer treated as the server itself, which switched rate limits and bot checks off for everyone.<\/li>\n<li>Fix: The admin-bar grade and the dashboard score are the same number. They were calculated two different ways, so the bar could show B while the dashboard showed C. WP-CLI's status command uses the same score.<\/li>\n<li>Fix: The malware scan no longer reports the account that installed WordPress as a suspicious new administrator on a site set up in the last hour.<\/li>\n<li>Fix: Live Traffic's All Traffic view stayed empty on file systems without file locking (some network and shared hosting storage). Blocked requests are now labelled with the event that blocked them and counted under Blocked, and addresses keep their encoded characters, so an attack string is shown as it was sent.<\/li>\n<li>Fix: Times in Recent Login Activity, the vulnerability list and two-factor devices were shown in the wrong time zone (\"3h ago\" for a sign-in a minute old) for anyone outside UTC.<\/li>\n<li>Developers: BruteForce::lock_sign_in() locks sign-in from an address without banning it from the site.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Fix: Hiding the WordPress version no longer stops browsers and CDNs from picking up updated files. Each asset version on public pages is replaced by a short hash unique to your site instead of being removed, script modules are covered too, and wp-admin keeps its normal versions.<\/li>\n<li>Fix: Behind Cloudflare, visitors are now identified by their real address out of the box (\"Trust Cloudflare\", on by default, only believed from Cloudflare's published addresses). Before, every visitor looked like a Cloudflare address, so bans and rate limits could hit real visitors.<\/li>\n<li>Fix: Cloudflare's addresses and your trusted proxies are never banned or allowlisted any more. Signing in as an administrator behind an unconfigured proxy could allowlist the proxy, letting every visitor routed through it skip the firewall.<\/li>\n<li>Fix: The honeypot, Live Traffic, CAPTCHA checks and several security events now use the same visitor address as the firewall. They used the proxy's address behind a CDN, so the honeypot banned the proxy instead of the attacker.<\/li>\n<li>Fix: Country blocking now works without a CDN, using a bundled IP-to-country table (IP Geolocation by DB-IP). Country headers are only believed when the request really came through Cloudflare or a trusted proxy. The admin screens and emails that show a country credit DB-IP, and a new opt-in setting adds the credit to the page shown to visitors blocked by a country rule (that page no longer shows the visitor's country).<\/li>\n<li>Fix: The malware scan now covers folders named \"cache\" (where web shells are often hidden) and every plugin folder, including this plugin's own. Unmodified files shipped with this plugin are recognised by their checksums, so its own detection rules are not reported.<\/li>\n<li>Fix: Signing in with two-factor authentication no longer counts as a failed login, and the login page now explains how to enter the code when login errors are hidden.<\/li>\n<li>Fix: The database scan now flags scripts and frames loaded from outside hosts, checks post meta (page builders), term descriptions and meta, and code-snippet plugins, reports a changed site address, and covers every post rather than the newest 5,000. Database signatures can now be delivered through the signed threat feed.<\/li>\n<li>Fix: Firewall blocks made before WordPress loads now trigger alerts and add-ons like every other event.<\/li>\n<li>Fix: Scan findings for files that no longer exist are closed automatically at the end of each scan.<\/li>\n<li>Fix: Importing thousands of bans now writes the firewall's ban file once instead of once per ban, and checking an address against banned ranges uses a sorted index.<\/li>\n<li>Fix: The site's own background requests (WP-Cron, Site Health) no longer trip its rate and query limits.<\/li>\n<li>Fix: Backups now include plugin folders named \"cache\"; only wp-content\/cache is left out.<\/li>\n<li>Fix: Impossible-travel and other intelligence alerts have their own email titles.<\/li>\n<li>Fix: Settings written directly to the database (for example with WP-CLI) are picked up immediately.<\/li>\n<li>Security: Passkey sign-in checks the site's domain on a label boundary.<\/li>\n<\/ul>\n\n<h4>1.4.14<\/h4>\n\n<ul>\n<li>Change: Internal identifiers that still carried the plugin's former name \u2014 the PHP namespace, constants, option, table, hook and capability prefixes \u2014 now use the current name throughout.<\/li>\n<\/ul>\n\n<h4>1.4.13<\/h4>\n\n<ul>\n<li>Change: The REST namespace is now <code>loyal-security\/v1<\/code> and the management capability is <code>manage_loyal_security<\/code>, replacing identifiers that still carried the plugin's former name. Any role an administrator had granted access to is moved across automatically on update.<\/li>\n<\/ul>\n\n<h4>1.4.12<\/h4>\n\n<ul>\n<li>Change: The \"External services\" section now also covers WordPress.org's checksum service, including that the weekly integrity check contacts it automatically and how to switch that off.<\/li>\n<li>Change: Documented that IP block and allow lists can be imported from another security plugin's own stored data, with an explicit statement of non-affiliation.<\/li>\n<li>Change: Restoring a database backup now runs every statement through <code>$wpdb-&gt;prepare()<\/code>, with the table name passed as an identifier placeholder.<\/li>\n<li>Change: A backup's database checksum is also recorded outside the backup folder, so a dump and its recorded checksum can no longer be altered together.<\/li>\n<li>Change: Core directory locations are now derived from WordPress rather than named directly.<\/li>\n<\/ul>\n\n<h4>1.4.11<\/h4>\n\n<ul>\n<li>Fix: Backups \u2014 any <code>%<\/code> character in the database (e.g. in posts or options) was written to the backup incorrectly and came back as a long placeholder code after a restore. Backups taken with 1.4.11 or later restore it correctly; restoring a backup taken with an earlier version does not repair values that were already stored incorrectly in that backup.<\/li>\n<li>Fix: Restoring a database backup now verifies the backup's checksum and only runs the statements a Loyal Security backup contains.<\/li>\n<li>Fix: CSV export of the audit log no longer stops at 200 rows.<\/li>\n<li>Fix: Removing the hardening .htaccess rules could damage the firewall's own .htaccess block.<\/li>\n<li>Fix: The weekly automatic malware scan runs again.<\/li>\n<li>Fix: With a custom login URL set, \"Lost your password?\" returned a \"page not found\" error and the lost-password form could not be submitted.<\/li>\n<li>Fix: The audit log and notification history showed events without their details, and the CSV export printed PHP warnings.<\/li>\n<li>Fix: The audit log no longer records the values of WordPress's secret keys and salts, and no longer raises an alert when WordPress creates them.<\/li>\n<li>Fix: Outbound-request protection no longer blocks the site's requests to itself (such as WP-Cron) when its address resolves to a private IP.<\/li>\n<li>Fix: Host-header protection no longer redirects WP-CLI and cron runs, accepts the site's home address, and keeps the port when redirecting.<\/li>\n<li>Fix: The audit log, Live Traffic and vulnerability matching now also work on SQLite databases, such as WordPress Playground.<\/li>\n<li>Fix: A \"translation loading was triggered too early\" notice when WP_DEBUG is on.<\/li>\n<li>Change: No feature is limited any more \u2014 full scan history, audit-log retention as configured, backup retention as configured, and the complete Live Traffic monitor with filters and payload details.<\/li>\n<li>Change: Passkey sign-in now goes through the standard WordPress login form.<\/li>\n<li>Change: The standalone recovery tool is now downloaded from Backup &amp; Recovery and uploaded by you, instead of being written into the plugin folder.<\/li>\n<li>Change: The breached-password check has an on\/off setting (Settings \u2192 Identity &amp; Access).<\/li>\n<li>Change: Features of the separate Loyal Security Pro plugin are described, not included.<\/li>\n<li>Change: Requires WordPress 6.6 or later.<\/li>\n<li>Security: Hardened input handling, output escaping and database queries throughout.<\/li>\n<\/ul>\n\n<h4>1.4.10<\/h4>\n\n<ul>\n<li>Improvement: General maintenance and internal code quality improvements.<\/li>\n<\/ul>\n\n<h4>1.4.9<\/h4>\n\n<ul>\n<li>Improvement: General maintenance and internal code quality improvements.<\/li>\n<\/ul>\n\n<h4>1.4.8<\/h4>\n\n<ul>\n<li>Fix: WordPress.org Plugin Check compliance pass \u2014 resolved several code-quality and internationalization warnings ahead of the official directory listing. No user-facing behavior changes.<\/li>\n<li>Fix: <code>Tested up to<\/code> bumped to the current WordPress release.<\/li>\n<\/ul>","raw_excerpt":"Firewall, malware scanner, file integrity monitoring, hardening, 2FA, backups, and audit logging \u2014 one self-contained plugin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/371092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=371092"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/totalsecuritywp"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=371092"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=371092"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=371092"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=371092"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=371092"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=371092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}