指南 · 约 3 分钟阅读

如何保护 WordPress 登录

简短回答:为每位管理员设置一个长且唯一的密码并启用双因素认证,限制同一地址的登录尝试次数,并删除没人使用的管理员账户。WordPress 核心本身不限制登录尝试次数,所以需要在 Web 服务器、CDN 或插件中添加限制。仅仅修改登录网址并不能起到保护作用。

更新于 · HackGrade

先检查你的网站。 免费扫描会告诉你需要做哪些修复。 WordPress 安全扫描

快速步骤

  1. 清理管理员账户. 删除不用的管理员,其余账户只给够用的最低角色。
  2. 开启两步验证登录. 为每位管理员和编辑使用带备用码的 TOTP 应用。
  3. 限制 wp-login.php 的请求频率. 在服务器、CDN 或插件中按 IP 地址限制尝试次数。
  4. 限制或关闭其他入口. 不使用时屏蔽 XML-RPC,并检查应用程序密码。
  5. 注销被盗会话. 一旦有怀疑,就更换密钥,让所有会话失效。

代码和配置保持英文。

为什么登录页是网站的大门

几乎每个 WordPress 网站的 /wp-login.php 和 /xmlrpc.php 都在全天被机器人用常见密码和泄露密码尝试登录。大多数得手并不是因为手段高明,而是因为某个密码在另一个泄露过的网站上被重复使用。一个被盗的管理员密码就足以安装恶意插件,所以登录需要多层防护。

1. 清理管理员账户

列出所有拥有完全控制权的人,删除或降级不需要该权限的人。内容作者通常只需要编辑或作者角色。

Terminal
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

每个人使用自己的账户(不要共用“admin”登录),并使用密码管理器生成的长且唯一的密码。如果网站仍有一个名字就叫 admin 的用户,请新建一个管理员,把内容转给它,再删除旧账户。

2. 开启双因素认证

两步验证登录能阻止大多数利用被盗密码的攻击,因为攻击者还需要用户手机上的验证码。WordPress.org 插件目录中的免费插件 Two Factor 支持身份验证器应用(TOTP)、邮件验证码和备用码。安装后,每位用户在 用户 → 个人资料 中自行开启。优先使用身份验证器应用而不是邮件验证码,把备用码交给用户,并要求每位管理员和编辑都必须开启。如果你已经在用某款安全套件,很多套件也提供同样的功能。

3. 限制登录尝试次数

WordPress 核心不限制失败的登录,所以机器人可以无限尝试。拦截它们的最佳位置是在 PHP 运行之前。在 nginx 上,对登录页设置请求频率限制,既能让真实用户通过,又能拖慢机器人:

nginx
# in the http { } block
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=10r/m;

# in the server { } block, above your general PHP location
location = /wp-login.php {
    limit_req zone=wplogin burst=5 nodelay;
    limit_req_status 429;
    # then the same fastcgi lines as in your location ~ \.php$ block, e.g.:
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/run/php/php-fpm.sock;
}

在你自己的网站上测试;快速发送几次请求后,应该会看到 429:

Terminal
for i in $(seq 1 20); do curl -s -o /dev/null -w '%{http_code} ' -X POST https://yourdomain.com/wp-login.php; done; echo

如果使用 Cloudflare,为 /wp-login.php 路径设置一条速率限制规则,就能在边缘节点实现同样的效果。在没有服务器权限的虚拟主机上,使用一款口碑良好的“限制登录尝试”插件是最实际的选择。

4. 只允许已知地址登录(可选)

如果所有登录的人都在固定 IP 地址办公,你可以对其他人关闭登录页。在 Apache 2.4 的 .htaccess 中:

.htaccess
<Files "wp-login.php">
    Require ip 203.0.113.10 198.51.100.0/24
</Files>

不要屏蔽 /wp-admin/admin-ajax.php:很多主题和插件会为访客调用它。如果你的团队从不断变化的网络登录,或者客户需要登录商店,请跳过这一步,改用双因素认证和登录限速。

5. 关闭其他入口

XML-RPC 是一个较老的远程 API,同样接受密码。如果你不使用 WordPress 移动应用或 Jetpack,请按照WordPress 加固清单中的方法屏蔽它。应用程序密码允许外部工具使用 REST API;在 用户 → 个人资料 中检查,并撤销任何你不认识的密码。如果没有任何工具使用它们,可以用一个小的必用插件(must-use)关闭该功能:

PHP
<?php
// wp-content/mu-plugins/no-app-passwords.php
add_filter( 'wp_is_application_passwords_available', '__return_false' );

6. 如果怀疑密码被盗

修改密码,然后更换 wp-config.php 中的密钥。这会让所有设备上的所有会话退出登录,包括攻击者的:

Terminal
wp config shuffle-salts

然后按照如何判断 WordPress 网站是否被黑中的方法,检查是否有不是你添加的管理员或插件。

隐藏登录网址有用吗?

把 wp-login.php 移到一个秘密地址可以减少日志中的机器人噪音,但这不是防护:地址会通过链接和插件泄露,而且对泄露的密码毫无作用。把它当作双因素认证和登录限速之后的额外措施。

HackGrade 会检查什么

免费扫描会标记 WordPress 公开列出的用户名、开放的 XML-RPC 端点,以及存在已知漏洞的过时 WordPress 核心、插件和主题。它从不尝试猜测密码,即使在深度扫描中也不会。

常见问题

WordPress 默认会限制登录尝试次数吗?

不会。WordPress 核心不限制失败的登录。请在 Web 服务器、CDN 或插件中添加限制。

WordPress 应该使用哪种双因素认证方式?

使用身份验证器应用(TOTP),并保存好备用码。邮件验证码聊胜于无,但任何能进入邮箱的人也能拿到验证码。

我应该修改 wp-admin 的网址吗?

这能减少机器人噪音,但挡不住有决心的攻击者或泄露的密码。只能作为双因素认证和登录限速之外的补充。

登录限速会把我的客户挡在外面吗?

只要限制合理就不会,例如每分钟 10 次尝试并留少量突发余量。真实用户很少在一分钟内登录超过几次。

参考资料

相关指南

免费 · 即时 · 无需注册

抢在别人之前了解你的评级。

被动扫描。未经你的许可,不会进行任何攻击性检测。

免费开始。Pro 每月 29 美元起(按年付费约合每月 24 美元),或 29 美元购买一次性完整报告。 查看价格