{"id":362320,"date":"2026-09-02T07:27:18","date_gmt":"2026-09-02T07:27:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flex-security\/"},"modified":"2026-09-02T07:26:44","modified_gmt":"2026-09-02T07:26:44","slug":"flex-website-security","status":"publish","type":"plugin","link":"https:\/\/km.wordpress.org\/plugins\/flex-website-security\/","author":23082855,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.3","stable_tag":"1.2.3","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Flex Website Security","header_author":"FLEX","header_description":"Practical WordPress hardening: login limits, custom login URL, captcha, IP blocks, country rules, XML-RPC, headers, and more.","assets_banners_color":"e8edf5","last_updated":"2026-09-02 07:26:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/flexible.am\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":36,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.3":{"tag":"1.2.3","author":"flexfields","date":"2026-09-02 07:26:44","revision":3677343}},"upgrade_notice":{"1.2.3":"<p>Renamed to Flex Website Security.<\/p>","1.2.2":"<p>Plugin URI removed for now. Author URI remains https:\/\/flexible.am\/.<\/p>","1.2.1":"<p>Readme and review fixes. Access \u2192 Clear lockouts now works. Permanent IP blocks are still kept.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3677349,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3677349,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3677424,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3677424,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3677438,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3677424,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.3"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[602,595,600,214603,6558],"plugin_category":[38,54],"plugin_contributors":[240619,232306],"plugin_business_model":[],"class_list":["post-362320","plugin","type-plugin","status-publish","hentry","plugin_tags-login","plugin_tags-recaptcha","plugin_tags-security","plugin_tags-turnstile","plugin_tags-xml-rpc","plugin_category-authentication","plugin_category-security-and-spam-protection","plugin_contributors-flexfields","plugin_contributors-hovoqoch","plugin_committers-flexfields"],"banners":{"banner":"https:\/\/ps.w.org\/flex-website-security\/assets\/banner-772x250.png?rev=3677424","banner_2x":"https:\/\/ps.w.org\/flex-website-security\/assets\/banner-1544x500.png?rev=3677424","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/flex-website-security\/assets\/icon-128x128.png?rev=3677349","icon_2x":"https:\/\/ps.w.org\/flex-website-security\/assets\/icon-256x256.png?rev=3677349","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Flex Website Security<\/strong> is a lightweight hardening toolkit \u2014 not a full WAF or malware scanner. It reduces common attack surfaces: brute-force logins, XML-RPC abuse, user enumeration, and loose admin defaults.<\/p>\n\n<ul>\n<li>Limit failed login attempts, with a lockout list you can unblock immediately<\/li>\n<li>Permanently block or unblock IPs<\/li>\n<li>Restrict by country: Allow from or Restrict from, on the whole site or admin only<\/li>\n<li>Custom login URL and hide wp-admin for guests<\/li>\n<li>Optional Cloudflare Turnstile or Google reCAPTCHA on login forms<\/li>\n<li>Login honeypot and generic login errors<\/li>\n<li>Disable XML-RPC and the theme\/plugin file editor<\/li>\n<li>Hide WordPress version<\/li>\n<li>Block user enumeration<\/li>\n<li>Basic security headers (HSTS is left to Flex SSL)<\/li>\n<\/ul>\n\n<p>Admin CSS and JavaScript ship with the plugin. Remote scripts and API calls run only when you enable captcha or the optional country lookup.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>IP lockouts and permanent blocks are stored in your WordPress database. Only administrators can view or change them on <strong>Flex Website Security \u2192 Access<\/strong>.<\/p>\n\n<p><strong>Captcha<\/strong> (off by default): if you choose Cloudflare Turnstile or Google reCAPTCHA and save both keys, the login form loads that provider\u2019s script and sends the visitor IP plus the captcha token to the provider for verification.<\/p>\n\n<p><strong>Country lookup<\/strong> (off by default): country rules first use CDN headers (Cloudflare, CloudFront, and similar). If you enable the optional geojs.io lookup, public visitor IPs without a header are sent to geojs.io and cached for 7 days.<\/p>\n\n<p>See <strong>Third-party services<\/strong> below for URLs, terms, and privacy policies.<\/p>\n\n<h3>Third-party services<\/h3>\n\n<p>These services are optional and off by default. No third-party script is loaded unless you choose a captcha provider and save both keys, or you enable the geojs.io lookup.<\/p>\n\n<h4>Cloudflare Turnstile<\/h4>\n\n<p>When enabled, the login form loads <code>https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js<\/code> and verifies tokens at <code>https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify<\/code>. Cloudflare receives the visitor IP and token.<\/p>\n\n<ul>\n<li>Service: <a href=\"https:\/\/www.cloudflare.com\/application-services\/products\/turnstile\/\">https:\/\/www.cloudflare.com\/application-services\/products\/turnstile\/<\/a><\/li>\n<li>Terms: <a href=\"https:\/\/www.cloudflare.com\/website-terms\/\">https:\/\/www.cloudflare.com\/website-terms\/<\/a><\/li>\n<li>Privacy: <a href=\"https:\/\/www.cloudflare.com\/privacypolicy\/\">https:\/\/www.cloudflare.com\/privacypolicy\/<\/a><\/li>\n<\/ul>\n\n<h4>Google reCAPTCHA<\/h4>\n\n<p>When enabled, the login form loads <code>https:\/\/www.google.com\/recaptcha\/api.js<\/code> and verifies tokens at <code>https:\/\/www.google.com\/recaptcha\/api\/siteverify<\/code>. Google receives the visitor IP and token.<\/p>\n\n<ul>\n<li>Service: <a href=\"https:\/\/www.google.com\/recaptcha\/about\/\">https:\/\/www.google.com\/recaptcha\/about\/<\/a><\/li>\n<li>Terms: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Privacy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>geojs.io<\/h4>\n\n<p>When enabled on Access, visitor IPs without a CDN country header are looked up at <code>https:\/\/get.geojs.io\/v1\/ip\/country\/{ip}<\/code> and cached for 7 days.<\/p>\n\n<ul>\n<li>Service: <a href=\"https:\/\/www.geojs.io\/\">https:\/\/www.geojs.io\/<\/a><\/li>\n<li>Terms \/ privacy: <a href=\"https:\/\/www.geojs.io\/\">https:\/\/www.geojs.io\/<\/a><\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>Flex Website Security is free software: you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.<\/p>\n\n<p>For more details, see https:\/\/www.gnu.org\/licenses\/gpl-2.0.html.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>flex-website-security<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the zip via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>Flex Website Security<\/strong>.<\/li>\n<li>Go to <strong>Flex Website Security \u2192 Settings<\/strong> and save the hardening options you need.<\/li>\n<li>Optional: <strong>Login page<\/strong> for a custom login URL and captcha.<\/li>\n<li>Optional: <strong>Access<\/strong> for lockouts, permanent IP blocks, and country rules.<\/li>\n<li>Open <strong>Audit<\/strong> to confirm which protections are on.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20a%20firewall%20or%20malware%20scanner%3F\"><h3>Is this a firewall or malware scanner?<\/h3><\/dt>\n<dd><p>No. Flex Website Security turns on common hardening options. Pair it with Flex SSL for HTTPS and HSTS, and keep WordPress, themes, and plugins updated.<\/p><\/dd>\n<dt id=\"what%20if%20i%20lock%20myself%20out%20of%20a%20custom%20login%20url%3F\"><h3>What if I lock myself out of a custom login URL?<\/h3><\/dt>\n<dd><p>Add <code>define( 'FLEX_SECURITY_DISABLE_CUSTOM_LOGIN', true );<\/code> to wp-config.php, or rename the plugin folder over SFTP. Bookmark the new login URL before you log out.<\/p><\/dd>\n<dt id=\"what%20if%20a%20country%20rule%20blocks%20the%20site%20or%20login%3F\"><h3>What if a country rule blocks the site or login?<\/h3><\/dt>\n<dd><p>Add <code>define( 'FLEX_SECURITY_DISABLE_COUNTRY_BLOCK', true );<\/code> to wp-config.php, then fix Mode, Apply to, or the country list on <strong>Access<\/strong>.<\/p>\n\n<p>Whole website mode still allows the login form so you can sign in and change the rule. Admin-only mode restricts login and wp-admin for guests.<\/p><\/dd>\n<dt id=\"does%20clear%20lockouts%20remove%20permanent%20ip%20blocks%3F\"><h3>Does Clear lockouts remove permanent IP blocks?<\/h3><\/dt>\n<dd><p>No. It removes temporary failed-login lockouts only. Permanent blocks stay until you Unblock them on Access.<\/p><\/dd>\n<dt id=\"do%20captcha%20failures%20count%20toward%20lockout%3F\"><h3>Do captcha failures count toward lockout?<\/h3><\/dt>\n<dd><p>No. Failed captcha checks do not increment the attempt counter.<\/p><\/dd>\n<dt id=\"will%20this%20break%20jetpack%20or%20a%20mobile%20app%3F\"><h3>Will this break Jetpack or a mobile app?<\/h3><\/dt>\n<dd><p>Disabling XML-RPC or Application Passwords can affect older apps and some Jetpack features. Turn those options off if you still need them.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%3F\"><h3>What happens when I uninstall?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes settings, IP lockouts\/blocks, and country lookup cache. It does not remove <code>DISALLOW_FILE_EDIT<\/code> if you defined that constant yourself in wp-config.php.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Renamed the plugin to Flex Website Security (slug flex-website-security).<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Removed Plugin URI for now. Author URI remains https:\/\/flexible.am\/.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>WordPress.org review readiness: complete readme (privacy, installation, FAQ, service terms) and Plugin URI.<\/li>\n<li>Tested up to WordPress 7.1.<\/li>\n<li>Fixed Access \u2192 Clear lockouts (it required an IP in the URL and never ran).<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added Access: view lockouts, permanently block or unblock IPs immediately, and country allow\/restrict rules (whole site or admin only).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added Login page: custom login URL, hide wp-admin for guests, Turnstile and reCAPTCHA.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Practical WordPress hardening: login limits, XML-RPC, headers, enumeration protection, and more.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=362320"}],"author":[{"embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/flexfields"}],"wp:attachment":[{"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362320"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362320"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362320"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362320"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362320"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/km.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}