{"id":275786,"date":"2026-01-24T05:16:19","date_gmt":"2026-01-24T05:16:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/xml-rpc-control-dashboard\/"},"modified":"2026-07-01T21:46:29","modified_gmt":"2026-07-01T21:46:29","slug":"xml-rpc-control-dashboard","status":"publish","type":"plugin","link":"https:\/\/kaa.wordpress.org\/plugins\/xml-rpc-control-dashboard\/","author":13667033,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.3","stable_tag":"1.0.3","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Disable XML-RPC - Dashboard Control","header_author":"aph5","header_description":"Comprehensive XML-RPC security management with dashboard widget, automated monitoring, email alerts, and intelligent rate limiting.","assets_banners_color":"596979","last_updated":"2026-07-01 21:46:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":278,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"aph5","date":"2026-01-24 05:14:54"},"1.0.1":{"tag":"1.0.1","author":"aph5","date":"2026-01-24 05:56:40"},"1.0.2":{"tag":"1.0.2","author":"aph5","date":"2026-07-01 21:11:24"},"1.0.3":{"tag":"1.0.3","author":"aph5","date":"2026-07-01 21:46:29"}},"upgrade_notice":{"1.0.3":"<p>Security hardening: &quot;Blocked&quot; mode now blocks the entire XML-RPC endpoint, including unauthenticated system\/demo methods that previously remained callable. Recommended for all users.<\/p>","1.0.2":"<p>Important fixes: failed-login and method rate limiting now actually block over-limit requests, &quot;Blocked&quot; mode now removes pingback\/high-risk calls (previously it did not), and uninstall now cleans up its transients. Recommended for all users.<\/p>","1.0.1":"<p>Plugin renamed to &quot;Disable XML-RPC - Dashboard Control&quot; for better search visibility. No functional changes.<\/p>","1.0.0":"<p>Initial release. Provides security management for WordPress XML-RPC interface.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3445967,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3445967,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3445967,"resolution":"1544x500","location":"assets","locale":"","width":3088,"height":1000},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3445967,"resolution":"772x250","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3445967,"resolution":"1","location":"assets","locale":"","width":3024,"height":1468},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3445967,"resolution":"2","location":"assets","locale":"","width":3024,"height":1468},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3445967,"resolution":"3","location":"assets","locale":"","width":3024,"height":1468},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3445967,"resolution":"4","location":"assets","locale":"","width":3024,"height":1468}},"screenshots":{"1":"Dashboard widget showing XML-RPC blocked","2":"Dashboard widget showing XML-RPC enabled","3":"Settings page with enable\/disable XML-RPC","4":"Settings page with Rate limiting enable\/disable"}},"plugin_section":[262246],"plugin_tags":[434,232610,600,14731],"plugin_category":[54],"plugin_contributors":[254585],"plugin_business_model":[],"class_list":["post-275786","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-dashboard","plugin_tags-rate-limiting","plugin_tags-security","plugin_tags-xmlrpc","plugin_category-security-and-spam-protection","plugin_contributors-aph5","plugin_committers-aph5"],"banners":{"banner":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/banner-772x250.png?rev=3445967","banner_2x":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/banner-1544x500.png?rev=3445967","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/icon-128x128.png?rev=3445967","icon_2x":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/icon-256x256.png?rev=3445967","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/screenshot-1.png?rev=3445967","caption":"Dashboard widget showing XML-RPC blocked"},{"src":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/screenshot-2.png?rev=3445967","caption":"Dashboard widget showing XML-RPC enabled"},{"src":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/screenshot-3.png?rev=3445967","caption":"Settings page with enable\/disable XML-RPC"},{"src":"https:\/\/ps.w.org\/xml-rpc-control-dashboard\/assets\/screenshot-4.png?rev=3445967","caption":"Settings page with Rate limiting enable\/disable"}],"raw_content":"<!--section=description-->\n<ul>\n<li>This plugin allows you to quickly toggle on\/off XML-RPC functionality from the Dashboard<\/li>\n<li>On initial installation and activation, XML-RPC will be disabled,<\/li>\n<li>It displays the current enabled\/disabled status in the dashboard, helping users avoid leaving access on unnecessarily.<\/li>\n<li>It features XML-RPC rate limiting functionality, providing some protection to users while XML-RPC is on.<\/li>\n<li>Rate limiting is on by default, but can be turned off. Note that it's not perfect security however, and we recommend XML-RPC is disabled after use.<\/li>\n<\/ul>\n\n<h4>Why Control XML-RPC?<\/h4>\n\n<p>XML-RPC is a WordPress feature that allows remote access to your site. While useful for legitimate applications like mobile apps and remote publishing, it's frequently exploited for:<\/p>\n\n<ul>\n<li>Brute force password attacks<\/li>\n<li>DDoS amplification attacks via pingbacks<\/li>\n<li>Spam distribution<\/li>\n<li>Resource exhaustion<\/li>\n<\/ul>\n\n<h4>Rate Limiting Protection<\/h4>\n\n<p>When enabled, the plugin automatically limits:<\/p>\n\n<ul>\n<li><strong>Failed Authentication<\/strong> - Maximum 5 failed login attempts per hour per IP<\/li>\n<li><strong>High-Risk Methods<\/strong> - Limits on pingback.ping, system.multicall, and other abuse-prone methods<\/li>\n<li><strong>IP Validation<\/strong> - Validates addresses and processes proxy headers correctly. Sites where the client connects directly are protected against IP spoofing automatically; sites behind a reverse proxy or CDN can declare their proxies via the <code>xmlrpc_control_trusted_proxies<\/code> filter so forwarded headers are only trusted from those addresses<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect, store, or transmit any user data outside your WordPress installation. All rate limiting data is stored temporarily using WordPress transients and is automatically cleaned up.<\/p>\n\n<h3>Additional Information<\/h3>\n\n<h4>Support<\/h4>\n\n<p>For support, feature requests, or bug reports, please visit the plugin's support forum.<\/p>\n\n<h4>Contributing<\/h4>\n\n<p>Feedback is welcomed.<\/p>\n\n<h4>Security<\/h4>\n\n<p>If you discover a security vulnerability, please report it responsibly via the WordPress security team or directly to the plugin author.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>xml-rpc-control-dashboard<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>View the dashboard widget on your main admin page or navigate to Settings &gt; XML-RPC Control<\/li>\n<li>Toggle XML-RPC on\/off as needed and configure rate limiting<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20break%20my%20mobile%20app%20or%20remote%20publishing%20tools%3F\"><h3>Will this break my mobile app or remote publishing tools?<\/h3><\/dt>\n<dd><p>If you use WordPress mobile apps or remote publishing tools (like blog editors), you'll need to keep XML-RPC enabled. The rate limiting feature provides an additional layer of defense against common automated attacks, though we still recommend disabling XML-RPC when not actively needed.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20xml-rpc%20is%20disabled%3F\"><h3>What happens when XML-RPC is disabled?<\/h3><\/dt>\n<dd><p>When disabled, every request to xmlrpc.php is terminated early with a 403 fault - including unauthenticated helper methods like system.listMethods. This means:<\/p>\n\n<ul>\n<li>No remote publishing<\/li>\n<li>No WordPress mobile app access<\/li>\n<li>No pingbacks\/trackbacks<\/li>\n<li>No XML-RPC method discovery or fingerprinting<\/li>\n<li>Jetpack and similar plugins may have reduced functionality<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20is%20the%20default%20state%20when%20i%20activate%20the%20plugin%3F\"><h3>What is the default state when I activate the plugin?<\/h3><\/dt>\n<dd><p>XML-RPC is blocked by default. If a user unblocks it, then XML-RPC rate limiting is enabled by default, but can be disabled in settings.<\/p><\/dd>\n<dt id=\"how%20does%20the%20rate%20limiting%20work%3F\"><h3>How does the rate limiting work?<\/h3><\/dt>\n<dd><p>Rate limiting tracks requests per IP address using WordPress transients (temporary data). It limits failed authentication attempts and high-risk methods to 5 per hour. This prevents basic automated attacks while allowing normal use.<\/p><\/dd>\n<dt id=\"can%20rate%20limiting%20be%20relied%20upon%3F\"><h3>Can rate limiting be relied upon?<\/h3><\/dt>\n<dd><p>We don't recommend users rely on rate limiting to secure their server. Rate limiting provides basic protection against automated attacks but has known limitations in high-concurrency scenarios. When XML-RPC is not needed, we recommend disabling it.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20with%20caching%3F\"><h3>Does this plugin work with caching?<\/h3><\/dt>\n<dd><p>Yes, the plugin works with all caching solutions. Rate limiting hooks into WordPress core authentication and XML-RPC systems, which execute before cached pages are served.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20jetpack%20and%20similar%20plugins%3F\"><h3>Is this compatible with Jetpack and similar plugins?<\/h3><\/dt>\n<dd><p>Yes, when XML-RPC is enabled, Jetpack and other plugins that rely on XML-RPC will continue to function normally. The rate limiting protects against abuse while allowing legitimate traffic.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: \"Blocked\" mode now terminates every XML-RPC request early with a 403 fault. Previously, unauthenticated methods that bypass WordPress's xmlrpc_enabled gate (demo.sayHello, system.listMethods, system.getCapabilities, system.multicall and some mt.* methods) remained callable while XML-RPC was blocked, allowing method discovery and fingerprinting.<\/li>\n<li>Fixed: the plugin description no longer mentions automated monitoring or email alerts, which were never shipped features.<\/li>\n<li>Improved: documentation now accurately describes IP spoofing protection - automatic for directly connected sites, and via the xmlrpc_control_trusted_proxies filter for sites behind a proxy or CDN.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed: the failed-authentication rate limiter now returns a proper WP_Error when an IP is over the limit. Previously it returned an IXR_Error from the authenticate filter, which WordPress core does not recognise as an authentication failure, so over-limit requests were not blocked correctly.<\/li>\n<li>Fixed: high-risk method rate limiting (pingback.ping, system.multicall, etc.) now actually blocks calls once the limit is reached. The previous version counted calls but could not reject them, because the underlying WordPress hook ignores return values. Enforcement now runs through the xmlrpc_methods filter.<\/li>\n<li>Fixed: when XML-RPC is set to \"Blocked\", unauthenticated pingback methods are now removed from the dispatch table. Previously the WordPress xmlrpc_enabled filter left pingbacks callable, so blocking was incomplete.<\/li>\n<li>Fixed: uninstall now correctly removes the plugin's rate-limiting transients. A LIKE-pattern escaping bug previously left these rows behind.<\/li>\n<li>Removed an OPTIMIZE TABLE call from uninstall (discouraged and unnecessary).<\/li>\n<li>Added: optional trusted-proxy support via the xmlrpc_control_trusted_proxies filter (accepts IPs and CIDR ranges). When set, forwarded headers are only trusted from declared proxies, hardening client IP detection against X-Forwarded-For spoofing.<\/li>\n<li>Improved: client IP detection now handles bracketed IPv6 proxy values with a port (e.g. [2001:db8::1]:443).<\/li>\n<li>Internal: moved static inline styles out of PHP markup into the stylesheet, per WordPress.org guidelines; removed an unused setting registration and an unused localized nonce.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Changed plugin name to \"Disable XML-RPC - Dashboard Control\" for improved search visibility<\/li>\n<li>No functional changes<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Dashboard widget with quick toggle<\/li>\n<li>Settings page under Settings &gt; XML-RPC Control<\/li>\n<li>Optional rate limiting for failed auth and high-risk methods<\/li>\n<li>Secure by default (XML-RPC disabled on activation)<\/li>\n<\/ul>","raw_excerpt":"Quickly toggle XML-RPC on\/off from your dashboard. Perfect for temporarily enabling access for mobile apps, then securing your site again.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/275786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=275786"}],"author":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/aph5"}],"wp:attachment":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=275786"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=275786"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=275786"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=275786"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=275786"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=275786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}