从早期版本开始,WordPress就内置了可以远程登录网站的功能。有时候,你想要登录你的网站,但身边又没有电脑。以往很长时间,解决方案是一个叫xmlrpc.php的文件。但近年来,这个文件变得更像是一个漏洞,而不是一个解决方案。那么Xmlrpc.php有什么用呢?
下文中我们来深入探讨xmlrpc.php是什么,以及它创建的原因。同时还概述了它引起的常见安全问题以及如何在您自己的 WordPress 网站上修补这些问题。
Xmlrpc.php是什么
XML-RPC 是 WordPress 的一项功能,它以XML作为编码机制、通过HTTP传输数据。由于 WordPress 不是一个自封闭的系统,它通过这种途径来完成偶尔与其他系统通信的工作。
例如,假设您想从移动设备发布文章到您的网站,当附近找不到计算机时。您可以使用 xmlrpc.php启用的远程访问功能来执行此操作。
xmlrpc.php 启用的核心功能允许您通过智能手机连接到您的网站,实现来自其他站点的回溯和 pingback,以及与 Jetpack 插件关联的一些功能。
为什么创建 Xmlrpc.php,它是如何工作的?
XML-RPC 的起源可以追溯到 WordPress 的早期,甚至是它成为 WordPress之前。
在互联网的早期,连接速度还非常缓慢,编写文章和发布到网络的过程比现在更加困难和耗时。大多数人不会在浏览器内编写内容,而是脱机编写,然后复制并粘贴到 Web 上。尽管如此,这个过程还远远不是理想状态。
当时的解决方案是创建一个离线博客客户端,您可以在其中撰写内容,然后连接到博客以发布它。此连接是通过 XML-RPC 完成的。有了XML-RPC的基本框架,早期的应用程序就使用这样的连接允许人们从其他设备登录到他们的WordPress网站。
XML-RPC的发展
2008 年,当时的WordPress版本是 2.6,可以选择启用或禁用 XML-RPC。但是,随着 WordPress iPhone应用的发布,它在默认情况下启用了 XML-RPC 支持,并且没有关闭该设置的选项。直到今天,情况仍然如此。
但是,随着时间的推移,此文件的功能已大大减少,文件的总体大小从 83kb 减少到 3kb,因此它的作用不再像过去那样大。
XML-RPC的将来
自从有了全新的WordPress API,我们可以预期XML-RPC功能被完全剔除。今天,此新 API 仍处于试用阶段,只能通过使用插件启用。
但是,您可以预期将来 API 会直接编码到 WordPress 核心中,这将主要消除对 xmlrpc.php 文件的需求。
新的 API目前并不完美,但它为xmlrpc.php所解决的问题提供了更强大、更安全的解决方案。
为什么要禁用 Xmlrpc.php
XML-RPC 最大的问题是安全隐患。这些问题不是直接与 XML-RPC 有关,而是使用该文件对您的网站进行暴力攻击。
当然,您可以使用高强度的密码和WordPress安全插件来保护自己。但是,最好的保护模式是简单地禁用这个功能。
XML-RPC 有两个主要弱点过去曾被利用过。
第一种是使用暴力攻击进入您的网站。攻击者将尝试使用各种用户名和密码组合使用 xmlrpc.php 访问您的网站。他们可以有效地使用单个命令来测试数百个不同的密码。这使他们能够绕过通常检测和阻止暴力攻击的安全工具。
第二种是通过 DDoS 攻击使站点宕机。黑客会使用WordPress中的pingback功能同时向数千个站点发送pingback。xmlrpc.php中的这个功能为黑客提供了几乎无穷无尽的IP地址,以分发 DDoS 攻击。
要检查 XML-RPC 是否在您的网站上运行,则可以通过一款叫做XML-RPC Validator的工具来检测。通过该工具访问您的网站,如果收到错误消息,则意味着您没有启用 XML-RPC。如果收到成功消息,则可以使用以下两种方法之一禁用xmlrpc.php。
方法 1:使用插件禁用 Xmlrpc.php
在 WordPress 网站上禁用 XML-RPC 很简单。
只需导航到”插件”,即可从 WordPress 仪表板中添加新插件。搜索插件Disable XML-RPC 并安装如下所示的插件:
激活插件后无需任何设置。此插件将自动插入必要的代码以关闭 XML-RPC。
但是请记住,某些现有插件可能会利用 XML-RPC 的某些部分,因此完全禁用它可能会导致插件冲突或站点的某些元素不再起作用。
如果只想关闭 XML-RPC 的某些元素,但仍允许某些插件和功能正常工作,请使用以下插件:
- Stop XML-RPC Attack。此插件将阻止所有 XML-RPC 攻击,但它将继续允许插件(如 Jetpack)和其他自动工具和插件保留对xmlrpc.php文件的访问。
- Control XML-RPC Publishing. 这款插件允许您保留xmlrpc.php提供的远程发布选项的控制和使用。
方法 2:手动禁用 Xmlrpc.php
如果您不想使用插件,并且喜欢自己动手,请按照此方法操作。它将在请求传递给 WordPress 之前阻止所有传入的xmlrpc.php访问请求。
打开 .htaccess 文件。您可能需要打开文件管理器或 FTP 客户端中的”显示隐藏文件”才能找到此文件。
在 .htaccess 文件中,粘贴以下代码:
1 | # Block WordPress xmlrpc.php requests |
注意:可以将上述代码中的xxx.xxx.xxx.xxx更改为您希望允许访问xmlrpc.php的 IP 地址,或完全删除此行。
或者在Nginx配置文件中添加如下代码:
1 | location ^~ /xmlrpc.php { |
注意:可以将上述代码中的xxx.xxx.xxx.xxx更改为您希望允许访问xmlrpc.php的 IP 地址,或完全删除此行。allow与deny行的顺序不能改变。如果设置了allow的IP地址的话,需要在这个location里面配置phpfastcgi参数,才能正常运行。
全文总结
总体而言,XML-RPC曾是解决由于对 WordPress 站点的远程发布而导致的一些问题的可靠解决方案。然而,这个功能带来了一些安全漏洞,最终对一些WordPress网站所有者造成了毁灭性的打击。
为了确保您的网站安全,最好完全禁用xmlrpc.php。除非您需要远程发布和 Jetpack 插件所需的一些功能,您应该使用允许这些功能的插件,同时仍达到修补安全漏洞的目的。
随着时间的推移,我们可以期望XML-RPC的功能集成到新的WordPress API中,这将在不牺牲安全性的情况下保持远程访问等功能。同时,保护自己免受潜在的XML-RPC安全漏洞的威胁。
前段时间,我在查看服务器日志时,发现很多不同的IP地址访问我的xmlrpc.php文件,随后搜索了一下,然后手动禁用了这个文件,禁用了之后,目前还没发现Jetpack插件有什么功能损失。WordPress的APP也可以正常编辑和发布文章、页面等。
到目前为止,我觉得禁用这个功能目前只有好处,暂时没发现坏处。于是,我翻译了这篇文章,同时加入了Nginx的配置方案,供大家参考。