ThemesCorners
博客
10 分钟阅读作者 ThemesCorners

2026 WordPress 安全加固清单

一份不掺水分的清单,列出今年真正能提升 WordPress 安全水位的十二项配置——包括 6.7 与 6.8 新增的。

2026 年的 WordPress 攻击面已经和 2022 年不一样了。我们如今看到的大部分入侵不是 WordPress 核心的零日,而是被窃取的 application password、滥用 REST 端点的插件 RCE 链,以及小插件被供应链劫持。下面这份清单是我们在交付每个站点时实际做的十二件事。

1. 强制使用 application passwords 访问 REST API

WordPress 6.7 已经把 application passwords 列为机器流量推荐的认证方式。关闭非 cookie 客户端基于密码的 REST 认证:

add_filter('wp_is_application_passwords_available', '__return_true');
add_filter('rest_authentication_errors', function ($result) {
    if (! empty($result)) return $result;
    if (! is_user_logged_in() && ! wp_get_current_user()->ID) {
        return new WP_Error('rest_not_logged_in', '需要认证。', ['status' => 401]);
    }
    return $result;
});

配合在 CDN 层做速率限制——Cloudflare 免费版就够。

2. 启用新的自动更新完整性校验

WordPress 6.8 默认对核心更新做了签名(Ed25519)。对插件,主动启用:

add_filter('automatic_updates_is_vcs_checkout', '__return_false');
add_filter('auto_update_plugin', '__return_true');

然后加一个通知 webhook,让你在分钟级知晓更新校验是否失败:

add_action('automatic_updates_complete', function ($update_results) {
    if (! empty($update_results['plugin']['failed'])) {
        wp_remote_post('https://hooks.slack.com/...', [
            'body' => json_encode(['text' => 'WP 自动更新失败']),
        ]);
    }
});

3. 不用就关掉 XML-RPC

大多数站点都不需要。它是仅次于 /wp-login.php 的第二大被攻击端点:

add_filter('xmlrpc_enabled', '__return_false');

确认你没在用 Jetpack Publicize、WP 移动 App,或旧的 IFTTT 集成再关。

4. 把 /wp-admin 放到 HTTP 基本认证后面

对编辑团队相对固定的站点,在 Nginx 层为后台加基本认证:

location ^~ /wp-admin/ {
    auth_basic           "Admins only";
    auth_basic_user_file /etc/nginx/.htpasswd-tc;
    try_files $uri $uri/ /index.php?$args;
}

分层认证意味着即便 WordPress 密码被偷,没有基本认证凭据也用不了——而基本认证凭据永远不会走公开的 auth API。

5. 锁定插件的校验和

WordPress 6.7 把 wp plugin verify-checksums 加进了 WP-CLI。用 cron 每晚跑一次,遇到 mismatch 就告警——这是几小时内(而不是几周)发现供应链入侵的关键。

6. 用自定义错误页替换 wp_die()

默认的 wp_die() 会在每次致命错误时泄露 WordPress 版本。简单 handler:

add_filter('wp_php_error_message', function () { return ''; });
add_filter('wp_php_error_args', function ($args) {
    $args['response'] = 500;
    return $args;
});

7. 怀疑被入侵时强制轮换会话密钥

加一个一键后台按钮,运行:

wp_destroy_other_sessions();
\WP_Session_Tokens::get_instance(wp_get_current_user()->ID)->destroy_all();

怀疑 cookie 被偷时,立刻使所有用户的活跃会话失效。

8. 关闭后台的文件编辑器

这一条基础到我们都不好意思承认还经常看到没启用:

define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);  // 同时禁止从后台安装插件

第二个常量阻止任何人(哪怕是被攻陷的管理员)通过 UI 安装恶意插件。

9. 设置严格的 Content-Security-Policy

在边缘配置(Vercel、Cloudflare Workers、Nginx)里:

Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...';
  style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;
  frame-ancestors 'none'; base-uri 'self';

样式上的 'unsafe-inline' 是使用块编辑器要付的代价——但 frame-ancestors 'none' 挡掉点击劫持,base-uri 'self' 挡掉 <base> 注入,2025 年我们都见过这两种真实攻击。

10. 用 Sentry(或同类工具)记录 PHP 错误

每条 PHP 警告都重要。攻击者就是通过 stack-trace 规律寻找可利用代码路径。把所有警告集中到一处;查询参数里突然出现的 Undefined index 往往就是攻击者在探测。

11. 启用 2FA——但用 passkey,别用 TOTP

WordPress 6.7 通过 WebAuthn API 加入了原生 passkey 支持。把它对所有编辑者强制开启:

add_filter('manage_users_columns', function ($cols) {
    $cols['passkey'] = 'Passkey';
    return $cols;
});
add_action('user_register', function ($userId) {
    update_user_meta($userId, '_passkey_required', 1);
});

Passkey 无法被钓鱼,TOTP 可以。

12. 每周跑一次 wp doctor

WP-CLI 的 doctor 命令从 2.10 起内置了 security 套件。把输出接到你的监控:

wp doctor check security --format=json | jq -e '[.[]|select(.status!="success")]|length==0'

退出码 1 = 这周有需要修。

别再做这些事

  • 改名 /wp-admin/wp-login.php。靠隐蔽不算安全。浪费 30 分钟配置、搞坏插件、阻挡不了任何真实攻击者。
  • 装 7 个安全插件。它们互相重叠、冲突、拖垮性能。Wordfence 或 iThemes Security 选一,配置好,就够了。
  • 用家里的 IP 给 /wp-admin 做白名单。运营商一换 IP,你周五晚上 11 点被自己锁在外面。我们走过这条路。

关于主机

2026 年的托管型 WordPress 主机(Pressable、Kinsta、WP Engine、Cloudways)会替你透明地搞定上面 1–4 项。如果你跑的是纯 VPS,那十二项你都得自己扛。按这个预算来。

相关文章