本文约 4,148 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:密码对了也没用
WordPress 被入侵的最常见路径是撞库——黑客从其他站点的泄露库里拿到账号密码组合,批量尝试登录你的后台。如果你的管理员密码恰好在其中(或者足够弱),后台就被拿下了。
两步验证(2FA,Two-Factor Authentication)的作用就是:即使密码泄露,攻击者没有第二重凭证也进不去。
对有后台管理权限的站点来说,这是投入产出比最高的一项安全配置——十分钟配置,能挡住绝大多数自动化入侵。
原理分析:TOTP 是什么
WordPress 的 2FA 主流实现是 TOTP(Time-based One-Time Password,基于时间的一次性密码),RFC 6238 标准。
原理:
- 你第一次配置时,插件生成一个密钥(secret),用二维码展示给你;
- 你的验证器 App(Google Authenticator、Microsoft Authenticator、1Password、微信小程序”二次验证码”)保存这个密钥;
- 之后每 30 秒,App 用
HMAC-SHA1(密钥, 当前时间戳/30)算出一个 6 位数; - 服务端用同样的密钥和同样的时间窗口算一遍,一致就通过。
关键点:
- 服务端和客户端不需要联网,靠的是共享密钥 + 时间同步;
- 时间必须同步,手机时间误差超过 30 秒就会验证失败;
- 密钥只出现一次(配置时),所以必须同时保存备用恢复码。
这就是”手机丢了怎么办”这个问题的根源——密钥在手机上,没备份就恢复不了。
保姆级实操
一、插件选择
| 插件 | 特点 | 适合 |
|---|---|---|
| Two Factor(官方) | WordPress 核心团队维护,轻量,支持 TOTP 和邮件验证码 | 追求稳定、不想装重型插件 |
| Wordfence Login Security | 集成在 Wordfence 里,功能最全,支持强制角色开启 | 已经装了 Wordfence 的站点 |
| Google Authenticator – WPOTP | 简单,只做 TOTP | 轻量需求 |
| miniOrange 2FA | 功能最多(支持短信、推送、硬件密钥),免费版有限制 | 企业级需求 |
| WP 2FA | 支持 TOTP、邮件、YubiKey,可强制角色 | 多用户站点 |
推荐组合:普通站点用 Two Factor(官方出品,无商业捆绑)或 WP 2FA;已经用 Wordfence 的直接开它自带的。
二、配置步骤(以 Two Factor 为例)
- 后台 插件 → 安装插件 → 搜 “Two Factor” → 安装启用;
- 用户 → 个人资料 → 页面下方 “Two Factor Options”;
- 点 “Enabled” 下的 TOTP(Time Based One-Time Password);
- 页面出现二维码 → 用验证器 App 扫码;
- App 显示 6 位数 → 填进 “Authentication Code” 框 → 点 Submit;
- 页面显示一串备用恢复码(Backup Codes),务必复制保存(存密码管理器或打印);
- 点 “Update Profile” 保存。
下次登录就会要求输入验证码。
三、强制所有管理员开启
光”建议”没用,客户和同事不会主动开。用 WP 2FA 插件可以配置强制策略:插件设置 → 选择”强制 TOTP” → 指定角色(administrator)→ 给一个宽限期(比如 7 天),超时未配置的用户会被限制登录。
代码方式(配合 Two Factor 插件):
// 未启用 2FA 的管理员,登录后强制跳转到个人资料页
add_action( 'admin_init', function() {
if ( ! class_exists( 'Two_Factor_Core' ) ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$screen = get_current_screen();
if ( 'profile' === $screen->id ) {
return; // 已在个人资料页,不跳
}
$user_id = get_current_user_id();
if ( ! Two_Factor_Core::is_user_using_two_factor( $user_id ) ) {
wp_safe_redirect( admin_url( 'profile.php#two-factor-options' ) );
exit;
}
});
四、只给管理员开(不给编辑开)
多作者的站点,给所有编辑强制 2FA 会引发大量抱怨。务实做法是只强制 administrator 角色,编辑和作者建议但不强制。
五、验证器 App 选择
- 国内可用:Microsoft Authenticator、1Password、Authy、微信小程序里的验证器;
- Google Authenticator 在国内需要能访问 Google 服务才能装(已装的能用);
- 不要用短信验证码做主要方式(SIM 卡交换攻击),只作为兜底。
六、三种自救方案(手机丢了 / 验证码失效)
方案 A:用备用恢复码登录(首选)
登录页输入用户名密码后,会有一个 “Use a backup code” 的链接,点进去输入之前保存的恢复码。
所以配置时的恢复码必须保存好——这是最省事的自救方式。
方案 B:用 WP-CLI 关闭某个用户的 2FA
有 SSH 权限的话最快:
# Two Factor 插件:删除用户的 TOTP 密钥 meta
wp user meta delete 1 _two_factor_totp_key
wp user meta delete 1 _two_factor_backup_codes
wp user meta list 1 --keys=_two_factor_totp_key
WP 2FA 插件:
wp user meta delete 1 wp_2fa_totp_key
wp user meta list 1 | grep 2fa
方案 C:数据库直接删
SELECT user_id, meta_key FROM wp_usermeta
WHERE meta_key LIKE '%two_factor%' OR meta_key LIKE '%2fa%';
DELETE FROM wp_usermeta
WHERE user_id = 1 AND meta_key IN ('_two_factor_totp_key','_two_factor_backup_codes','_two_factor_provider');
方案 D(终极):重置管理员密码
如果连密码也忘了:
wp user update 1 --user_pass=NewStrongPassword123
wp user list --fields=ID,user_login,roles
七、时间不同步导致验证码错误
这是最常见的”验证码一直不对”的原因。
# 服务器时间
date
# 服务器时区
wp option get timezone_string
手机端:验证器 App 一般有”同步时间”功能(Google Authenticator 设置里有 “Time correction for codes”)。
服务器校准:
sudo timedatectl set-timezone Asia/Shanghai
sudo apt install -y ntpdate && sudo ntpdate -u ntp.aliyun.com
八、临时关闭 2FA(调试/迁移时)
在 wp-config.php 里加:
// 紧急情况临时禁用插件(会禁用所有插件)
// 更精准的做法是通过数据库或 CLI 删 meta
更精准的做法就是用上面的 wp user meta delete。
常见踩坑与失败案例
- 案例一:管理员配了 2FA 但没保存恢复码,换手机后彻底进不去后台,最后只能进数据库删 meta。
- 案例二:服务器时间比实际快了 5 分钟,所有人的验证码都失效。校准 NTP 后恢复。服务器必须配 NTP 时间同步。
- 强制 2FA 后客户投诉:客户不懂配置,被拦在门外。正确做法是先发一份图文配置说明,再给 7 天宽限期,宽限期内不拦截。
- 多站点:子站的用户 2FA 配置是独立的(存在各自的
wp_X_usermeta),要分别配。 - 案例三:装了两个 2FA 插件,两个都启用,登录时要输两次验证码,偶尔冲突导致登录失败。只装一个。
- 备份恢复后 2FA 失效:TOTP 密钥存在
wp_usermeta里,恢复备份会恢复到旧密钥,只要手机上的还在就没事。 - 应用密码和 2FA 的关系:开启 2FA 后应用密码仍然可用(它是独立的凭证体系),这不影响自动化脚本(如阶段 3 的发布脚本),但也意味着应用密码本身要保管好。
总结
两步验证是防撞库最有效的手段,配置只需十分钟。选型上普通站点用官方 Two Factor 或 WP 2FA,已装 Wordfence 的直接用它的 Login Security。三条必须遵守的纪律:配置时一定保存备用恢复码;服务器配 NTP 时间同步(时间漂移会导致验证码全失效);只强制管理员角色,编辑作者建议不强制以免引发抵触。自救手段按优先级:恢复码 → wp user meta delete 删 TOTP 密钥 → wp user update 重置密码。最后提醒:开启 2FA 后应用密码仍然可用,脚本发布不受影响。
