it-swarm.cn

消除xmlrpc.php的最佳方法是什么?

什么是在不需要时从WordPress中消除xmlrpc.php文件的最佳方法?

24
prosti

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

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

最好的办法是使用插件禁用xmlrpc.php函数,而不是删除或禁用文件本身。文件本身将在WordPress核心更新中被替换,而插件将在核心更新后保持禁用,如果您更改主题。

请参阅 https://wordpress.org/plugins/search.php?q=disable+xml-rpc 了解不同的插件。他们都有微小的差异。

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

4
markratledge

对于在IIS中托管WordPress的极端少数群体,您可以使用IIS URL重写模块执行类似htaccess的限制。下面的示例假设真正的客户端IP来自X-Forwarded-For标头,已知的白名单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>
3
BRass

当您能够通过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
3
tweber

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

这也有一个优点,就是能够阻止URL以逃避那些随时返回不同IP地址的讨厌机器人。

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

我有一些问题,它首先在服务器上产生504超时和502坏网关错误,但似乎已经安定下来。

迄今为止对结果印象非常深刻,并且在安装Wordfence之前对网站进行了黑客攻击之后产生了有价值的清理配置文件,尽管总是拥有最新版本的WordPress和插件。

Wordfencehttps://www.wordfence.com/

0
Steve

在第一种方式中,您可以将代码add_filter('xmlrpc_enabled', '__return_false');放在文件functions.php或特定于站点的插件中。显然,建议将其放在特定站点中,而不是编辑文件functions.php

以及消除xmlrpc的其他方法

0
yaser hamzeloy

我使用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;
}
0
Manuel K