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

#1 楼

由于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>


,或使用它禁用NGINX服务器块对xmlrpc.php文件的访问。

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



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


请始终对文件进行备份。编辑/添加。





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

我忘了提这个。它应该已经集成到了当时无法实现的核心(WordPress 4.1版)中。但看起来,它将成为WordPress 4.5的核心。当前替代方案是此插件:WordPress REST API(版本2)
您可以使用它直到Restful API也是WordPress的核心WordPress.WordPress 4.5发布的目标日期。 (2016年4月12日(+ 3w))


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


评论


如果我正确的话,WordPress移动应用程序确实需要这样做-将来一旦我们过渡到WordPress RESTful API(WordPress 4.5),可能就不需要了

–prosti
16-3-4在7:55



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

– SarahCoding
16年8月10日在17:02

将类似的内容添加到functions.php会在更改主题时失去所有效果。 function.php仅用于设计目的,请使用插件!

–大卫
16-09-20在11:07

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

–查尔斯
16-09-20在16:14

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

–戴夫
17年2月7日,19:45



#2 楼

如果可以通过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 -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 楼

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

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


#4 楼

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

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

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

#5 楼

对于在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>


#6 楼

第一种方法是将代码add_filter('xmlrpc_enabled', '__return_false');放入文件functions.php或特定于站点的插件中。显然,与编辑文件functions.php相比,更建议将其放在特定于站点的文件中。

以及其他消除xmlrpc的方法

#7 楼

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

这也具有优势能够阻止URL从那些讨厌的bot一次又一次返回不同IP地址的情况中逃脱。

我不知道它是否允许Apps正确使用xmlrpc.php

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

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

Wordfence https://www.wordfence.com/

评论


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

–adam-asdf
17年9月22日在18:38

#8 楼

我为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;
}