5项必做:先做这些
- 保持WordPress核心、主题和插件更新。有漏洞的插件是头号攻击向量。启用次要版本的自动更新(WordPress 5.6+默认如此)。对于主要版本,在发布后7天内更新。对于插件,为可信的开启自动更新;手动查看关键插件的版本说明。
- 为每个WordPress账户使用强且唯一的密码。尤其是管理员账户。使用密码管理器(1Password、Bitwarden)。停用「admin」这个用户名:创建一个新管理员并删除旧的。
- 启用双重身份验证。使用Wordfence Login Security(免费)或我们的2FA二维码生成器配合任意TOTP应用。2FA能挫败超过99%的撞库攻击。
- 安装一款可信的安全插件。Wordfence(免费版对大多数网站已足够)或Solid Security。不要叠加多个:它们会冲突。该插件会管理登录尝试限制、文件完整性监测和恶意软件扫描。
- 每日异地备份。UpdraftPlus → Dropbox/Google Drive。在需要之前就先备好份。至少完整测试一次恢复流程。
接下来的10项:额外的高影响措施
- 强制HTTPS。Let's Encrypt在每个现代主机托管上都免费。在服务器级别把HTTP重定向到HTTPS。
- 更改数据库表前缀。WordPress默认使用wp_;在安装时把它改成自定义的。这并不能阻止攻击,但会使某些攻击模式更困难。
- 如果不使用XML-RPC就停用它。XML-RPC是常见的暴力破解放大向量。如果你不使用Jetpack移动应用或远程发布,就通过.htaccess或插件停用它。
- 限制登录尝试。Wordfence会自动这么做。可阻止暴力撞库。
- 轮换WordPress的认证密钥/salt。使用我们的WordPress Salt生成器。在任何疑似入侵之后、在删除被入侵的管理员之后,以及作为例行每6-12个月轮换一次。
- 使用SSH或SFTP传输文件,绝不用明文FTP。FTP以明文传输凭据。
- 尽可能按IP限制对wp-admin的访问。如果你的团队使用固定IP(办公室、VPN),就把wp-admin仅限于这些IP。通过.htaccess或Nginx配置实现。
- 在wp-config.php中停用文件编辑。添加:
define('DISALLOW_FILE_EDIT', true);这能防止攻击者在入侵某个账户后从后台编辑主题/插件。 - 隐藏WordPress版本号。移除meta generator标签。这并不能阻止攻击,但能减少指纹识别。
- 锁定文件权限。文件644,目录755,wp-config.php设为600。大多数托管型主机托管会自动这么做;在VPS上,请显式配置。
锦上添花:好但不关键
- 自定义登录URL(例如WPS Hide Login)。主要是减少机器人流量的噪声;并非真正的安全。
- 登录表单上的CAPTCHA。对自动化攻击造成轻微阻力。
- 在/uploads/中停用PHP执行。防止上传的PHP shell被执行。
- 使用Cloudflare的WAF(免费档次)。在恶意流量到达你的服务器之前将其过滤。
- 为插件/核心更新设置一封管理员邮件提醒。
- 使用HSTS预加载在浏览器级别强制HTTPS。
- 通过REST API停用用户枚举(Solid Security或Wordfence会处理)。
- 使用内容安全策略(CSP)标头。
- 停用目录浏览(大多数主机托管默认如此)。
- 用外部服务监测正常运行时间+完整性(UptimeRobot免费档次+每周一次Sucuri SiteCheck)。
- 把用户角色限制到最小权限。大多数贡献者不需要编辑级别的访问权。
- 数据库备份加密(UpdraftPlus Premium提供)。
- 通过CDN将图片托管在主域名之外(减少攻击面)。
- 定期审查安全审计日志。
- 如果网站产生可观收入,每年做一次渗透测试。
WordPress安全迷思:跳过它们
若干被高度推荐的「安全」措施提供的实际保护微乎其微:(1)「隐藏WordPress版本」:知道你的版本会对定向攻击稍有帮助,但真正的解决办法是更新,而非隐藏。(2)「把wp-config.php移到public_html之上」:基本上带来零安全收益;该文件已受.htaccess保护。(3)「停用REST API」:会破坏许多插件,却拦不住多少东西。应改为限制特定端点。(4)「叠加多个安全插件」:它们会冲突并重叠。一款可信的插件(Wordfence或Solid Security)能覆盖三款插件所做的事。(5)「重命名wp-login.php」:以隐蔽求安全;攻击者很容易通过重定向找到新URL。
如果你被黑了:恢复清单
- 不要惊慌;不要立即删除东西。先对当前状态拍一份快照用于取证分析。
- 让网站下线(维护模式插件或用.htaccess重定向到静态页面)。
- 更改所有管理员密码并轮换WordPress的salt。
- 审计用户账户:立即删除无法识别的管理员账户。
- 用Wordfence Premium或Sucuri扫描恶意软件。
- 将当前文件与一份干净的WordPress下载进行比对:diff会揭示被修改的核心文件。
- 检查数据库的wp_options表是否有意外条目(其中常含被注入的JS)。
- 从最近的干净备份恢复(这正是每日备份重要的原因)。
- 恢复后,审计每个插件:删除未使用的,全部更新,并替换任何有公开CVE的插件。
- 将WordPress核心更新到最新版本。
- 重新启用网站,并在30天内留意是否再次被感染。