nginx 日志里 /xmlrpc.php 每分钟四百多条 POST,响应体只有三百多字节,状态码全是 200。wp_users 里多出三个用户名像随机串的账号。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
location = /xmlrpc.php {
access_log off;
return 403;
}
# functions.php
add_filter('xmlrpc_enabled', '__return_false');
system.multicall 允许一个请求里塞几百组用户名密码,服务端逐组校验并返回结果,爆破速度被放大几百倍。WordPress 默认开着这个入口,大部分站点根本不用它。这一点先确认清楚,后面就不用反复试。
「xmlrpc 爆破」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,先在主题的 functions.php 里加过滤器,把 xmlrpc_enabled 直接返回 false;nginx 层再补一个 location 直接拒绝,两层都要有;确认没有 App、Jetpack 这类依赖 xmlrpc 的功能,关掉后观察一周。
改完照着核一遍,curl 访问 /xmlrpc.php 返回 403,日志里不再出现 system.multicall 字样。
