暴力破解攻击是最简单的入侵方式:攻击者反复尝试用户名/密码组合,直到找到正确的一组。由于这些尝试是自动化的且通常分布式的(僵尸网络),即使是不成功的攻击也会用大量请求压垮你的网站。

这并非 WordPress 独有——任何暴露登录接口的 Web 应用程序都可能成为目标——但 WordPress 的流行使其成为常见的焦点。以下指南反映了 2025 年针对 WordPress 站点的当前最佳实践,并取代了旧有的、更脆弱的技术。


关键防御一览

  • 使用强且唯一的密码及密码管理器。
  • 为所有管理员账户启用双因素认证 (2FA)(使用插件或身份提供商;WordPress 核心不包含 2FA)。
  • 通过信誉良好的插件考虑使用通行密钥 (WebAuthn),以实现防钓鱼登录。
  • 在边缘(WAF/CDN)或 Web 服务器端对登录尝试进行速率限制。
  • 在登录处放置 CAPTCHA/turnstile以减缓机器人(例如 Cloudflare Turnstile、reCAPTCHA)。
  • 如果不需要,请保护或禁用 XML-RPC;否则限制并对其进行速率限制。
  • 保持 WordPress 核心、主题和插件为最新版本。
  • 监控并告警认证异常;暂时封禁恶意 IP。
  • 优先使用边缘/WAF 保护(Cloudflare、Sucuri、托管提供商提供的 WAF),以便在流量到达你的服务器之前拦截恶意流量。

提示:隐藏登录 URL 可以减少噪音,但不应作为唯一的防御手段。


WordPress 级别保护

强制使用强密码

WordPress 在更改密码时会显示强度计。鼓励使用唯一、长密码(或短语)以及密码管理器。避免使用字典单词和个人信息。

双因素认证 (2FA)

使用信誉良好的插件或你的身份提供商为所有管理员和特权用户启用 2FA(TOTP 应用、硬件密钥、SMS 回退)。截至 2025 年,WordPress 核心不附带 2FA;必须通过插件或 SSO/IdP 添加。

通行密钥 (WebAuthn)

通行密钥使用平台验证器(Face ID/Touch ID、Windows Hello、安全密钥)提供防钓鱼的无密码登录。通过支持 WebAuthn/通行密钥的维护插件添加,并为每个管理员注册至少两个验证器。

应用密码(用于集成)

对于受信任的应用程序/服务的 API 访问,请使用应用密码(WordPress 5.6 中引入)。它们限定访问范围,且可以在不更改用户密码的情况下撤销。

限制登录尝试(应用层)

如果你的主机/CDN 不在边缘进行速率限制,安全插件可以减缓登录尝试。请注意,应用层插件仍在 PHP 内执行,因此在遭受重攻击时会消耗一些资源;在可能的情况下,请优先使用边缘或服务器级节流。

XML-RPC 注意事项

xmlrpc.php 是常见的暴力破解目标(尤其是 system.multicall 方法)。如果你不使用 XML-RPC,请禁用它。如果你使用(例如 Jetpack、移动应用),请限制它(WAF 规则)并激进地进行速率限制。


服务器 / 代理 / WAF 保护

这些示例需要服务器或代理访问权限,且可能因环境而异。在生产环境应用之前在测试环境中进行测试。

Apache(示例)

阻止或限制恶意登录尝试(示例需要适当的模块,如 mod_rewrite、mod_authz_host,或第三方工具如 ModSecurity 或 mod_evasive)。

按 IP 拒绝(Apache 2.4+):

# wp-login.php: allow specific IPs only
<Files "wp-login.php">
    Require ip 203.0.113.15 203.0.113.16
</Files>

向静态错误页面发送 401/403:

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html

考虑使用 ModSecurity 规则集(例如 OWASP CRS)以在服务器层检测和阻止暴力破解模式。

Nginx(示例)

限制登录和 XML-RPC:

# Define a shared zone for rate limiting
limit_req_zone $binary_remote_addr zone=logins:10m rate=10r/m;

server {
    # ...

    location = /wp-login.php {
        limit_req zone=logins burst=20 nodelay;
        include fastcgi_params;
        # pass to PHP-FPM or upstream as usual
    }

    location = /xmlrpc.php {
        limit_req zone=logins burst=20 nodelay;
        include fastcgi_params;
        # pass to PHP-FPM or upstream as usual
    }
}

按 IP 拒绝:

location = /wp-login.php {
    allow 203.0.113.15;
    allow 203.0.113.16;
    deny all;
    # pass to PHP-FPM or upstream as usual
}

自定义错误页面:

error_page 401 /401.html;
error_page 403 /403.html;

Caddy (v2)(示例)

使用基本身份验证密码保护 /wp-login.php:

# Hash passwords first: `caddy hash-password`
basicauth /wp-login.php {
    user1 JDJhJDEw$example-hash-value...
    # add more users as needed (one per line)
}

Caddy 需要在 Caddyfile 中使用哈希化的密码。

按 IP 限制对 /wp-login.php 的访问:

@blacklist {
    not client_ip forwarded 203.0.113.15 203.0.113.16
    path /wp-login.php
}
respond @blacklist "Forbidden" 403 {
    close
}

对 /wp-admin/* 返回 401 并提供自定义错误页面:

@wpadmin path /wp-admin/*
respond @wpadmin "Unauthorized" 401

handle_errors {
    @need401 status 401
    rewrite @need401 /401.html
    file_server
}

拒绝没有 Referer 的 POST 请求到登录/评论(可选,请谨慎使用):

# Legitimate clients or privacy tools may omit Referer; test before enforcing.
@protected path_regexp protected (wp-comments-post|wp-login)\.php$
@no_referer {
    not header Referer https://{host}*
    method POST
}
abort @no_referer

使用 abort 会立即断开连接,这对机器人来说效率很高。

有关更多 Caddy 讨论和理由,请参阅:在 WordPress 中使用 Caddy 阻止暴力破解攻击(社区线程)。

Windows IIS(示例)

使用 web.config 按 IP 限制 WP Admin:

<location path="wp-admin">
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="203.0.113.15" allowed="true" />
        <add ipAddress="203.0.113.16" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
</location>

自定义 401 页面:

<system.webServer>
  <httpErrors errorMode="Custom">
    <remove statusCode="401" />
    <error statusCode="401" path="/401.html" responseMode="File" />
  </httpErrors>
</system.webServer>

主机/CDN WAF 保护

托管 WAF(Cloudflare、Sucuri 或你的托管提供商)可以:
– 在边缘过滤已知恶意 IP 和自动化登录尝试。
– 强制执行机器人管理、挑战页面和特定于登录的规则。
– 对 /wp-login.php 和 /xmlrpc.php 全局应用速率限制。
– 为可疑请求添加CAPTCHA/turnstile 挑战。

优势:在流量到达你的服务器之前进行拦截,从而在高流量攻击期间保存资源。


额外加固与操作提示

  • 不要使用用户名 admin。创建单独的管理员账户并降级或删除旧用户。
  • 限制管理员数量;日常工作时使用最小权限角色。
  • 审计日志以查看失败的登录并枚举来源;暂时封禁恶意 IP(例如 Fail2ban)。
  • 避免永久国家封锁列表。它们可能会阻止合法用户且难以维护。
  • 确保处处使用 HTTPS以保护传输中的凭据。
  • 备份:维护经过测试、具备离线功能的备份,并演练恢复程序。

另请参阅


关于已弃用/旧版内容的说明

旧版指南通常建议对整个 /wp-admin 目录使用繁重的 .htaccess 重写、国家 IP 封禁列表或 BasicAuth。如今这些措施要么不可靠,要么会破坏基于 AJAX 的插件,要么降低用户体验。请改用边缘级 WAF、双因素认证 (2FA)、通行密钥和针对性速率限制。当您确实应用服务器级封禁时,请将其范围限定得尽可能窄(例如 /wp-login.php、/xmlrpc.php),并记录您的站点所需的例外情况(移动应用、Jetpack、单点登录 SSO)。