消除xmlrpc.php的最佳方法?


Answers:


26

由于WordPress 3.5 XML-RPC默认情况下启用了此选项(),因此无法从WordPress将其关闭dashboard

添加此代码段以在中使用functions.php

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

// Disable X-Pingback to header
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
    unset( $headers['X-Pingback'] );

return $headers;
}

尽管它按照它所说的做,但是当站点受到攻击时,通过点击它,它可能会变得很密集。
您最好在.htaccess文件中使用以下代码段。

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>

或者使用它禁用xmlrpc.php从NGINX服务器块访问文件。

# nginx block xmlrpc.php requests
location /xmlrpc.php {
    deny all;
}

请注意,禁用也会影响通过移动设备登录。如果我是正确的,WordPress移动应用程序确实需要这样做。
有关使用的更多信息,请参见CodexXML-RPC

  • 在编辑/添加之前,请始终备份文件。


编辑/更新

@Prosti,-您绝对正确-关于RESTful API将为WordPress提供的选项!

我忘了提这个。它应该已经集成到当时无法实现的核心(WordPress 4.1版)中。但看起来,它将成为WordPress 4.5的核心。

当前的替代方法是该插件:WordPress REST API(版本2)
您可以使用它直到Restful APIWordPress的核心。
WordPress 4.5发布的目标日期。(2016年4月12日(+ 3w))

对于那些有兴趣的人RESTful,在Stackoverflow上是一个非常不错的社区Wiki。


2
如果我是正确的话,WordPress移动应用程序确实需
要这样做

2
对于那些仍然获得X-Pingback单个帖子/页面标题的用户。我们需要使用另一个过滤器将其完全删除:add_filter('pings_open', '__return_false', PHP_INT_MAX);
MinhTri'8

1
添加这样的内容functions.php在更改主题时将失去所有效果。function.php仅用于设计目的,请使用插件!
大卫,

@David,当然可以,但是ppl最好使用mu-plugins文件夹,而不要使用这样的插件。当ppl需要/使用这样的功能时,他们出于某种原因拥有该功能,并且不希望任何人(甚至不是管理员)都可以选择停用插件。
查尔斯

看起来那里=的nginx conf代码的第一行中缺少等号()。这对我location = /xmlrpc.php {
Dave

5

我们正在使用htaccess文件来保护它免受黑客攻击。

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php

5

当您能够通过Web服务器的配置阻止它时,@ Charles的建议是好的。

如果只能使用php禁用它,则xmlrpc_enabled过滤器不是正确的方法。就像这里记录的一样:https : //developer.wordpress.org/reference/hooks/xmlrpc_enabled/ 它仅禁用需要身份验证的xml rpc方法。

而是使用xmlrpc_methods过滤器禁用所有方法:

<?php
// Disable all xml-rpc endpoints
add_filter('xmlrpc_methods', function () {
    return [];
}, PHP_INT_MAX);

您可以通过将以下内容发送到xmlrpc.php来测试POST的运行情况:

<methodCall>
    <methodName>system.listMethods</methodName>
</methodCall>

如果过滤器正常工作,则只剩下3种方法:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <string>system.multicall</string>
                        </value>
                        <value>
                            <string>system.listMethods</string>
                        </value>
                        <value>
                            <string>system.getCapabilities</string>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodResponse>

您可以使用curl快速测试它:

curl -X POST \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/xml' \
  -d '<methodCall><methodName>system.listMethods</methodName></methodCall>' \
  https://your-wordpress-site.com/xmlrpc.php

4

最好的办法是禁用xmlrpc.php带有插件的功能,而不是删除或禁用文件本身。该文件本身将在WordPress核心更新时被替换,而插件将在核心更新后以及您更改主题后将其禁用。

有关不同的插件,请参见https://wordpress.org/plugins/search.php?q=disable+xml-rpc。它们都有细微的差别。

这些插件的功能与添加到主题functions.php文件中的功能或向order,allow deny.htaccess中添加规则的功能相同(如其他答案所述),不同之处在于插件或功能禁止xmlrpc.php通过PHP进行调用,.htaccess中的规则有效通过利用Web服务器(即Apache或Nginx)中的mod_rewrite。在现代服务器上使用PHP和mod_rewrite之间没有明显的性能差异。


3

对于在IIS中托管WordPress的极少数用户,您可以使用IIS URL重写模块执行类似htaccess的限制。下面的示例假定X-Forwarded-For标头中包含真实的客户端IP,已知的白名单IP为55.55.555.555,并且您要使用HTTP 404响应非白名单IP。

<rule name="wordpress-restrictions" enabled="true" stopProcessing="true">
    <match url="(^xmlrpc.php)|(^wp-admin)|(^wp-login.php)" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_X_FORWARDED_FOR}" pattern="(^55\.55\.555\.555$)" negate="true" />
    </conditions>
    <action type="CustomResponse" statusCode="404" subStatusCode="44" statusReason="File or directory not found" statusDescription="The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable." />
</rule>


0

我最近安装了Wordfence,从6.3.12版本开始,它可以阻止直接访问任何位置。将/xmlrpc.php放到禁止访问的IP列表中的“选项”页面上,“立即阻止访问这些URL的IP”现在表明大约每15分钟就会阻止一次尝试。

这还有一个优势,就是能够阻止URL从那些讨厌的僵尸程序中逃脱,这些僵尸程序一次又一次地使用不同的IP地址。

我不知道它是否允许Apps使用xmlrpc.php进行有效操作。

我遇到了一些问题,起初在服务器上会产生504 Timeout和502 Bad Gateway错误,但似乎已经解决了。

迄今为止的结果给人留下了深刻的印象,尽管该站点在安装Wordfence之前遭到黑客入侵,并且始终拥有最新版本的WordPress和插件,但它产生了有价值的清理配置文件。

Wordfence https://www.wordfence.com/


添加/xmlrpc.php到禁止访问IP的安全规则中似乎可以阻止合法流量。如果一个站点启用了pingbacking链接,则该站点将向该URL发送请求并立即被阻止...似乎可能会引起问题。
adam-asdf

0

我为nginx使用了这个小的代码,并且可以100%使用

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.