Skip to content

WordPress security on VIP

Multiple layers of security are in place to protect WordPress applications:

Site access

WP Cron, XML-RPC, and login endpoints

VIP has multiple security protections in place to protect against unauthorized access and abuse of the WP Cron (/wp-cron.php), login (/wp-login.php), and XML-RPC (/xmlrpc.php) endpoints.

  • At the network level, dynamic security protocols are in place that can be triggered by unusual behavioral patterns. An automated attack would trigger VIP’s dynamic security measures, and login attempts would be completely blocked.
  • The functionality of WordPress Core’s /wp-cron.php is disabled on WordPress VIP. Cron control on WPVIP is initiated and regulated by Automattic’s Cron Control plugin.
  • Brute force attempts on /wp-login.php and /xmlrpc.php are detected and mitigated at the edge (i.e., firewall, NGINX). Attempts to obfuscate the URL of the WordPress login page by altering the URL—via a plugin or otherwise—will remove VIP’s brute force login protections from the login URL.
  • Access to the /xmlrpc.php endpoint is restricted to authorized requests only.
  • The XML-RPC server in WordPress core code prevents more than one failed authentication attempt per a system.multicall request.

Rate limiting

Rate limiting is a strategy to constrain how often an action can be repeated within a certain timeframe. The implementation of rate limiting can help to prevent some forms of malicious bot activity and to reduce strain on web servers. On the VIP Platform, rate limiting is in place at the application level for all WordPress sites, managed by VIP MU plugins, and at the edge.

XML-RPC rate limiting

The rate limiting threshold for XML-RPC requests at the edge is 10 times per minute, with a one-hour block timeout when this is exceeded. During the block timeout, 403s are returned. This rate is global and not customizable per application.

Login rate limiting

Logic applied to the login rate limiting threshold varies depending on the context. For example, for any given username+IP combination, the limit is 5 failed attempts every 5 minutes. This layer protects against more localized, user-specific attacks.

The login rate limiting thresholds can be adjusted with the wpcom_vip_ip_login_threshold and wpcom_vip_ip_username_login_threshold filters. Custom code using these filters should be added to a file located within /client-mu-plugins.

The number of failed login attempts to allow for an IP address can be adjusted with the wpcom_vip_ip_login_threshold filter. In this code example, the threshold limit is set to 10:

add_filter( 'wpcom_vip_ip_login_threshold', function() {
    return 10;
} );

The number of failed login attempts to allow for an IP address and username combination can be adjusted with the wpcom_vip_ip_username_login_threshold filter. In this code example, the threshold limit is set to 1 for login attempts by the usernames exampleuserone and exampleusertwo:

add_filter( 'wpcom_vip_ip_username_login_threshold', function( $threshold, $ip, $username ) {
    if ( 'exampleuserone' === $username || 'exampleusertwo' === $username ) {
        $threshold = 1;
    return $threshold;
}, 10, 3 );

Last updated: March 22, 2024

Relevant to

  • WordPress