What Is XML-RPC in WordPress? Why You Should Disable It

On This Page

If you’ve ever run a security scan on your WordPress site — say, using a tool like FunSentry — you may have seen a warning flag next to something called XML-RPC. The recommendation is almost always the same: disable it.

But what exactly is XML-RPC? Why does WordPress include it? And why do security professionals universally recommend turning it off?

In this guide, we’ll break down everything you need to know — and show you three practical methods to disable it today.


What Is XML-RPC?

XML-RPC stands for XML Remote Procedure Call. It’s a protocol that allows external applications to communicate with your WordPress site over HTTP by sending and receiving data formatted in XML.

In simpler terms, XML-RPC is a doorway that lets other software — like mobile apps, desktop editors, or third-party services — interact with your WordPress site without logging into the admin dashboard.

How It Works (Simplified)

External App → sends XML request → yoursite.com/xmlrpc.php → WordPress processes it → sends XML response

For example, an app might send a request to xmlrpc.php asking WordPress to publish a new blog post, retrieve a list of comments, or upload a media file — all without touching the WordPress dashboard.

A Brief History

XML-RPC has been part of WordPress since its early days. It was originally designed to enable:

  • Remote publishing from desktop apps like Windows Live Writer and MarsEdit
  • Pingbacks and trackbacks between blogs
  • Mobile app access via the WordPress mobile app (before the REST API existed)

In WordPress 3.5 (released December 2012), XML-RPC was enabled by default and the option to disable it from the admin dashboard was removed.

This was a reasonable decision at the time. But today, over a decade later, the landscape has changed dramatically.


Why XML-RPC Is a Security Risk

The problem with XML-RPC isn’t what it was designed to do — it’s how attackers abuse it. There are three primary attack vectors.

1. Brute Force Amplification Attacks

This is the most common and dangerous exploit.

With a normal brute force attack against wp-login.php, an attacker must send one HTTP request per password guess. Most security plugins can easily detect and block this pattern.

XML-RPC changes the equation entirely. The system.multicall method allows an attacker to try hundreds or even thousands of username/password combinations in a single HTTP request.

Here’s what that looks like:

<methodCall>
  <methodName>system.multicall</methodName>
  <params>
    <param>
      <value>
        <array>
          <data>
            <value>
              <struct>
                <member>
                  <name>methodName</name>
                  <value><string>wp.getUsersBlogs</string></value>
                </member>
                <member>
                  <name>params</name>
                  <value>
                    <array>
                      <data>
                        <value><string>admin</string></value>
                        <value><string>password123</string></value>
                      </data>
                    </array>
                  </value>
                </member>
              </struct>
            </value>
            <!-- hundreds more attempts packed into this single request -->
          </data>
        </array>
      </value>
    </param>
  </params>
</methodCall>

With one HTTP request, the attacker can test 500+ passwords. Most rate-limiting plugins only count HTTP requests — so they see one request, not 500 login attempts.

This makes XML-RPC brute force attacks orders of magnitude more efficient than traditional login-page attacks.

2. DDoS Amplification via Pingbacks

WordPress’s pingback system uses XML-RPC to notify other blogs when you link to their content. Attackers abuse this by sending pingback requests from thousands of WordPress sites to a single target:

  1. Attacker sends a pingback request to yoursite.com/xmlrpc.php
  2. Your WordPress site makes an HTTP request to the target URL specified in the pingback
  3. The attacker repeats this across thousands of WordPress sites simultaneously
  4. The target receives thousands of requests — a DDoS attack

Your site becomes an unwitting participant in the attack, and the target sees traffic originating from legitimate WordPress sites, making it harder to block.

3. Server Resource Exhaustion

Even without a successful login, XML-RPC requests consume server resources. Each system.multicall request triggers multiple authentication attempts against your database. Under sustained attack, this can:

  • Slow down your site for legitimate visitors
  • Increase hosting costs (CPU, memory, bandwidth)
  • In extreme cases, crash your server

How to Check If XML-RPC Is Enabled on Your Site

Quick Method: Use FunSentry

The fastest way is to run a free scan at www.funsentry.com. The scanner sends a system.listMethods request to your site’s xmlrpc.php endpoint and reports whether it responds — exactly what an attacker would do to check if the door is open.

Manual Method: cURL

You can also check from the command line:

curl -X POST https://yoursite.com/xmlrpc.php \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>'

If XML-RPC is enabled, you’ll see a long XML response listing all available methods — this means it’s accessible to attackers too.

If XML-RPC is disabled, you’ll get an HTTP 403 (Forbidden), 404 (Not Found), or 405 (Method Not Allowed) response.


3 Methods to Disable XML-RPC

Method 1: Using .htaccess (Apache) — Recommended

This is the most effective approach because it blocks requests at the web server level, before PHP even executes. Add this to your .htaccess file in the WordPress root directory:

# Block all XML-RPC requests
<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

If you need to allow specific IPs (e.g., Jetpack servers), you can whitelist them:

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
  Allow from 122.248.245.244
  Allow from 54.217.201.243
</Files>

Method 2: Using Nginx Configuration

If your server runs Nginx, add this to your server block:

# Block XML-RPC
location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    return 403;
}

Reload Nginx after making changes:

sudo nginx -t && sudo systemctl reload nginx

Method 3: Using a WordPress Filter (functions.php)

If you don’t have access to server configuration files, you can disable XML-RPC via your theme’s functions.php or a custom plugin:

// Disable XML-RPC entirely
add_filter('xmlrpc_enabled', '__return_false');

// Also remove the XML-RPC endpoint from the head
add_filter('wp_headers', function($headers) {
    unset($headers['X-Pingback']);
    return $headers;
});

// Remove RSD link from head (advertises XML-RPC availability)
remove_action('wp_head', 'rsd_link');

Important note: The xmlrpc_enabled filter only disables XML-RPC methods that require authentication. The system.listMethods endpoint and pingback functionality may still respond. For complete protection, combine this with Method 1 or 2.


What About Jetpack and the WordPress Mobile App?

This is the most common concern — “Will disabling XML-RPC break anything?”

WordPress Mobile App

The official WordPress mobile app no longer requires XML-RPC. Since 2016, the app has used the REST API (via /wp-json/) for communication. You can safely disable XML-RPC without affecting the mobile app.

Jetpack

Jetpack historically relied heavily on XML-RPC for its connection to WordPress.com. However, Jetpack has been migrating to the REST API for most of its features. If you’re using Jetpack, test after disabling XML-RPC. If any features break, use the IP whitelist approach shown in Method 1.

Other Third-Party Integrations

Some older plugins or services may still use XML-RPC. Before disabling it, check if you’re using:

  • IFTTT WordPress integrations
  • Zapier (older WordPress triggers)
  • Legacy desktop publishing tools

If you’re unsure, disable XML-RPC and monitor your site for a few days. If nothing breaks, you’re good.


XML-RPC vs. REST API: The Modern Alternative

WordPress introduced the REST API in version 4.7 (December 2016). It serves the same purpose as XML-RPC — allowing external applications to interact with WordPress — but does it better:

FeatureXML-RPCREST API
Data formatXMLJSON
AuthenticationBasic auth (username + password in plain text)OAuth, Application Passwords, JWT
Multiple callssystem.multicall (abusable)Batch requests with proper rate limiting
DiscoverabilityUndocumented methodsSelf-documenting endpoints
Modern app supportDeprecatedActively maintained
SecurityNo built-in rate limitingSupports nonce verification and capability checks

The REST API is the successor to XML-RPC. There is no modern use case that requires XML-RPC and can’t be accomplished through the REST API.


Defense in Depth: Beyond Just Disabling XML-RPC

Disabling XML-RPC is one piece of a comprehensive WordPress security strategy. Here are related hardening steps:

  1. Use strong, unique passwords — Even if XML-RPC is enabled, a 32-character random password makes brute force impractical
  2. Implement Two-Factor Authentication (2FA) — Adds a second layer even if credentials are compromised
  3. Limit login attempts — Use a plugin to block IPs after failed login attempts on wp-login.php
  4. Keep WordPress core, plugins, and themes updated — Patch known vulnerabilities promptly
  5. Monitor HTTP Security Headers — Ensure HSTS, CSP, and X-Frame-Options are properly configured
  6. Restrict REST API user enumeration — Block the /wp-json/wp/v2/users endpoint from unauthenticated access
  7. Run regular security scans — Use tools like FunSentry to catch misconfigurations before attackers do

Summary

QuestionAnswer
What is XML-RPC?A legacy protocol that lets external apps communicate with WordPress
Is it still needed?No — the REST API has replaced it for all modern use cases
What are the risks?Brute force amplification, DDoS participation, server resource exhaustion
Should I disable it?Yes, unless you have a specific legacy integration that requires it
Best method to disable?Block at the web server level (.htaccess or Nginx) for maximum protection

XML-RPC was useful when it was introduced. Today, it’s an unnecessary attack surface on your WordPress site. Disabling it takes less than five minutes and immediately closes one of the most commonly exploited entry points.


This article was written by the FunSentry security research team. FunSentry is a free online WordPress security scanner that performs passive security checks including XML-RPC detection, HTTP Security Headers analysis, plugin vulnerability scanning, and more. Scan your site now to see if XML-RPC is enabled on your WordPress site.