发布于 2026-01-06 3 阅读
0

WordPress 安全手册

WordPress 安全手册

了解关于 WordPress 安全的所有知识,以及如何有效地保护您的 WordPress 网站免受黑客攻击。

欢迎阅读《2021年WordPress安全手册》。我将尝试教您如何有效地保护您的WordPress网站免受恶意攻击者和黑客的侵害。掌握WordPress安全知识,并知道如何保护自己和您的客户免受恶意攻击者的侵害,会让您的工作更加轻松。

本手册不仅是一本实用指南,我还力求全面概述 WordPress 安全方面的所有重要内容。首先,我会带您了解 WordPress 网站最常见的几种攻击类型,并指导您如何保护网站安全。然后,我们将探讨主机托管、备份、更新、HTTPS 以及其他相关主题,这些内容将大大降低您遭受此类攻击的风险。

如果您发现本 WordPress 安全手册有任何遗漏,请在文章下方的评论区留言。现在,让我们开始吧。

WordPress 安全手册简介

WordPress是全球使用最广泛的内容管理系统(CMS)。截至2021年7月,互联网上约有42%的网站以WordPress为基础。WordPress的流行使其成为黑客的热门目标。如果在较新的WordPress核心版本中发现漏洞,就可能攻击数千万甚至数亿个网站。这其中蕴藏着巨大的商机。互联网上实时统计的网站被黑客攻击数量就足以说明问题的严重性。

然而,大多数情况下,WordPress 核心本身并不是我们最关心的问题。真正让我们担忧的是 WordPress 的底层架构以及构建在其上的应用。如果底层 Web 服务器存在漏洞,那么其上的 WordPress 网站也可能面临风险。同样的道理也适用于存在漏洞的插件和主题,以及它们的配置方式。

没有绝对安全的方法可以完全抵御网络攻击。这一点适用于所有软件。然而,一些标准和规范可以帮助您保护 WordPress 网站免受大多数攻击。这就是我将在本手册中向您展示的内容。

常见攻击类型 / 了解攻击

黑客

在学习如何保护您的 WordPress 网站之前,让我先向您展示我们通常会保护网站免受哪些威胁。了解了这些之后,您就能更好地应对安全问题,并知道应该采取哪些措施。所以,千万不要跳过这部分!

这并非所有可能出现的黑客攻击类型的完整列表,而是最常见的几种,作为 WordPress 开发人员,您应该了解这些攻击类型。

XSS攻击

如果攻击者能够将恶意脚本注入网站,他们就可以执行所谓的跨站脚本攻击(XSS)。攻击者随后可以窃取会话信息或以用户身份执行请求。


网站中的脚本是什么?

当我们谈到网站脚本时,通常指的是HTML文档中的JavaScript代码。借助JavaScript,你可以在客户端浏览器中运行逻辑。例如,WordPress区块编辑器主要就是用JavaScript编写的。


简单 XXS 攻击的表示

如果目标拥有网站的管理员权限,XSS 攻击可能尤其危险。攻击者此时可以通过多种方式控制整个网站。

XSS攻击可以通过清理和逃逸来防止。

清理是指在将用户输入的内容输入数据库之前,从脚本或 HTML 中删除尖括号 <> 和危险内容的过程。

这是未经清理的 JavaScript 代码:

<script>
 alert("Hello world");
</script>
Enter fullscreen mode Exit fullscreen mode

消毒后变成这样:

&lt;script&gt;
 alert(&quot;Hello world&quot;);
&lt;/script&gt; 
Enter fullscreen mode Exit fullscreen mode

现在,即使没有任何浏览器运行它,也可以安全地将其注入到网站中。

但作为第二道防线,数据在注入 HTML 之前也应该进行转义。WordPress主题手册中的解释对转义做了最好的阐述:

“转义是指通过去除不需要的数据(例如格式错误的 HTML 或脚本标签)来保护输出的过程,防止这些数据被视为代码。”

您可以在 OWASP网站上找到关于 XSS 的更详细和更全面的解释

CSRF攻击

每当你向服务器发出 HTTP 请求时,服务器都会执行一些操作。例如,你访问这篇博客文章,就指示服务器从数据库中获取文章并将其组装成一个有效的 HTML 文档(我们暂且忽略缓存)。这类请求被称为非破坏性请求,它们不会对文档内容进行任何更改。

但是,你也可以发出一些具有破坏性或恶意的 HTTP 请求,这些请求可以创建、更改或删除数据。例如,如果你在 WordPress 后台创建一篇博客文章并点击保存,你就会向服务器发送一个 HTTP 请求,将文章保存到数据库中。或者,如果你点击“删除”按钮,你就会发送一个 HTTP 请求,将文章从数据库中删除。

通常情况下,这类端点会受到保护,防止未经身份验证和未经授权的请求。例如,您必须登录才能执行这些请求。

假设你是一个博客的管理员,你有删除博客文章的权限。如果我给你发一个链接,你点击这个链接就会向你的网站提交删除请求,你会怎么做?

这可以看作是所谓的跨站请求伪造(CSRF)攻击的一个非常简化的版本。攻击者会诱使受害者去做他们想让他们做的事情。

简单跨站请求伪造 (CSRF) 的表示

随机数(Nonce)有助于防御 CSRF 攻击。这些是随机生成的密钥,会附加到执行特定操作的链接或表单中。它们只能使用一次,之后会自动生成一个新的。如果随机数不存在或无效,请求将被拒绝。

使用 nonce 防止 CSRF 攻击

我们以 WordPress 后台顶部栏的“清除缓存”按钮为例。

此按钮链接到以下网址:

https://omniploy.com/wp-admin/index.php?nginx_helper_action=purge&nginx_helper_urls=all&_wpnonce=4b4sh4x6bd


我把参数放在单独的行上,这样更易​​于阅读。通常情况下,所有内容都在一行里。

此 URL 末尾包含 nonce 值。这意味着我只能使用此链接发出一次请求,因为 nonce 值仅有效一次。

如果有人想诱骗我执行缓存清除操作,他们需要知道一个有效的 nonce 值,否则,即使我已经登录,请求也会被拒绝。

表单也是如此。nonce 通常以隐藏字段的形式注入。以下是 WordPress 后台个人资料编辑表单的一个例子:

<! -- ... -->
 <form id="your-profile" action="https://omniploy.com/wpadmin/profile.php" method="post" novalidate="novalidate">
   <input type="hidden" id="_wpnonce" name="_wpnonce" value="391e11d52e">
   <! -- ... -->
Enter fullscreen mode Exit fullscreen mode

如果你发现某个端点会在收到请求后立即执行某些破坏性操作,且不需要 nonce 值,请务必向开发者报告。否则,你可能会被误导,在无意中执行你不希望执行的操作。

您可以在维基百科上找到关于 CSRF 攻击的更详细解释

SQL注入

WordPress 安装程序使用 SQL 作为与数据库通信的语言。每次对文章、页面等进行更改时,都会执行 SQL 查询。有时是从数据库读取数据,有时是向数据库写入数据。如果未经授权的人员能够不受控制地执行此类 SQL 查询,那将非常危险。

如果攻击者能够注入未经验证的 SQL 代码,则称为 SQL 注入攻击。

一个相当常见的 SQL 查询语句如下所示:

INSERT INTO users (firstname, lastname, email, ...)
VALUES ("John", "Doe", "john@doe.com", ...);
Enter fullscreen mode Exit fullscreen mode

未经正确清理就插入用户输入可能会导致严重后果。

如果有人在名字栏中输入以下值,会发生什么情况呢?

"); 从用户中删除; --

如果不进行清理,这个例子会导致“users”表完全被清空:

INSERT INTO users (firstname, lastname, email, ...)
VALUES (""); DELETE FROM users; -- ", "Doe", "john@doe.com", ...);
Enter fullscreen mode Exit fullscreen mode

因此,在执行 SQL 查询之前,系统会对用户输入进行过滤,就像处理危险的 JavaScript 代码一样。这样可以防止 SQL 注入攻击。

更多关于SQL 注入的内容,请访问 W3Schools网站。

蛮力攻击

在暴力破解攻击中,恶意攻击者会尝试大量密码来猜测特定账户的密码。攻击者通常使用包含常用密码的密码数据库,因此这种攻击方式也称为字典攻击。

登录暴力破解攻击的示意图

如果没有对登录尝试次数的限制(或者登录表单上的验证码),攻击者可以在几秒钟内测试数千个密码。

因此,使用强密码至关重要,密码必须与您本人没有任何关联。密码中不要包含生日或孩子的名字,只能是随机字符或单词。攻击者可以轻易地发起个性化字典攻击。

您还应该检查您的密码是否已存储在某种密码数据库中。例如,您可以使用Have I Been Pwned 网站的 Pwned Passwords 数据库进行检查。许多密码管理器也内置了此类检查功能。

关于暴力破解攻击的更多信息,请参阅维基百科

中间人攻击

中间人攻击,也称为猴子中间人攻击,是指攻击者将自身置于客户端和服务器之间进行攻击。这可以通过多种方式实现,例如通过交换机、网关或服务器和客户端之间的任何其他节点。

典型的中间人攻击示意图

中间人攻击正是我们如今使用加密连接的原因。HTTPS 提供端到端加密,防止任何中间攻击者窃取数据。

关于中间人攻击的更多信息,请参阅维基百科

拒绝服务 (DoS) 攻击

拒绝服务攻击旨在使您的 WordPress 网站瘫痪,从而阻止其他访问者访问。DoS 攻击通过向服务器发送大量请求,直至其无法再处理任何其他请求而发起。

拒绝服务攻击的表示

Cloudflare 有一篇关于 Slowloris DoS 攻击的精彩文章,很好地解释了这一概念。

分布式拒绝服务 (DDoS) 攻击

DDoS攻击与普通DoS攻击类似,但利用的是分布式计算能力。与单台计算机试图瘫痪服务器不同,DDoS攻击由多台计算机共同发起。受控节点的数量可以从几个到几千个甚至几十万个不等。

DDoS攻击的表示

大型公司经常会遭遇大规模的DDoS攻击

社会工程

社会工程学是指操纵个人或群体,使其按照攻击者的意愿行事。社会工程学攻击通常与跨站脚本攻击 (XSS) 或跨站请求伪造攻击 (CSRF) 结合使用。

想象一下,你收到一封来自PayPal的钓鱼邮件,要求你确认密码或其他类似信息。他们的目的是诱导你访问一个虚假的登录页面并输入你的登录凭证。如果你真的输入了凭证,那就说明你已经中了社交工程的圈套。黑客通过这种方式窃取登录凭证,因此这种攻击也被称为网络钓鱼攻击。

精心设计的社会工程攻击通常针对有影响力的人群,例如管理员或拥有高权限的用户。你的权力越大(例如网站管理员),就越需要警惕自己被骗。

imperva 在这篇文章中对社会工程学进行了更详细的阐述

供应链攻击

在 WordPress 环境中,另一种常见的攻击方式是控制插件的更新基础设施,也称为供应链攻击。攻击者可以通过从其他开发者那里购买插件或入侵开发者的账户来实现这一目标。

供应链攻击的表征

因此,选择信誉良好的开发者提供的插件至关重要。插件更新安装后,会将旧的插件源文件替换为新的源文件。这意味着,插件更新可能包含开发者想要添加的任何源代码,包括恶意源代码。

最近针对 SolarWinds 的攻击也是供应链攻击。

关于供应链攻击的更多信息,请参见维基百科。

破解过时的软件

利用过时的软件进行攻击可能是 WordPress 最常见的安全漏洞类型。过时的插件、主题,甚至底层服务器软件都包含一些公开已知的安全漏洞,这些漏洞在新版本中已被修复。如果软件(插件、主题、服务器软件)没有定期更新,这些漏洞就无法得到修复,从而使您的网站容易受到攻击。

本指南后续将介绍更多更新内容。

零日漏洞攻击

零日漏洞是指开发者或公众尚未发现的缺陷。零日攻击是指恶意攻击者发现漏洞后,不将其报告给开发者,而是直接利用该漏洞。

零日攻击在小型 WordPress 网站上并不常见。它们通常针对的是“大网站”。这是因为发现零日漏洞既困难又成本高昂。攻击者会尽可能长时间地掩盖零日漏洞,使其不为公众所知。但是,漏洞被利用的次数越多,被发现和修复的几率就越高。

关于零日漏洞的更多信息,请参阅维基百科

WordPress 安全环境中的主机提供商

主机提供商

在讨论 WordPress 安全时,主机提供商是最关键的环节之一。即使你投入大量时间和金钱来尽可能确保 WordPress 及其所有插件的安全,如果底层基础设施遭到破坏,一切都将徒劳无功。

主机类型

您可以选择不同类型的托管服务。哪种最适合您,取决于您的预算以及您愿意投入多少时间进行维护。

托管 WordPress 主机

托管型 WordPress 主机服务商是最昂贵的选择,但他们也拥有最专业的 WordPress 团队。他们通常还会提供 WordPress 专属工具和系统,例如扩展的自动更新流程、WAF(Web 应用防火墙,稍后会详细介绍)、测试环境等等。

例如:

通用托管服务

这些主机提供商并非只专注于 WordPress。它们通常提供类似cPanel 的管理界面,并允许您安装多种不同类型的系统。如果您选择这类主机,则应格外注意安全性。许多此类主机提供商的服务器更新速度较慢,而我们不希望服务器上存在任何已修复的漏洞。

例如:

专用/VPS主机

专用物理服务器或虚拟专用服务器 (VPS) 是位于数据中心内的物理(或虚拟)服务器,您可以租用它并进行任何您想要的操作。您需要安装操作系统、运行 Web 服务器所需的软件,并且需要负责后续的维护工作。

除了购买物理服务器并在现场构建基础设施之外,这是设置主机时最低级别的选择。

此外,还有托管型VPS解决方案。这类似于共享主机,但您无需与他人共享服务器。主机提供商会负责底层操作系统和Web服务器所需的软件。

例如:

云托管

云主机类似于独立主机,区别在于您只需为使用的资源付费。您可以轻松应对高峰时段的资源扩展,并在资源不足时缩减资源。然而,云主机也意味着更高的成本。与独立服务器或VPS相比,云资源的价格相对较高。

得益于虚拟基础设施,专用主机和云主机之间的差异正在缩小。许多主机提供商同时提供这两种服务,有时只需单击一下或几个步骤即可在两者之间切换。

例如:

正常运行时间

网站正常运行时间应至少达到 99%。网站宕机对搜索引擎优化、用户体验和收入都十分不利。

对于那些主要流量来自谷歌的网站来说,搜索引擎优化(SEO)尤为重要。谷歌会将网站宕机时间作为排名因素之一。他们依赖你的网站在流量到达时保持在线。一年内多次宕机可能会长期损害你的搜索引擎排名。

对于电商平台而言,这可能造成更大的损失。平台每宕机一分钟,就无法产生任何订单。

确认您的主机提供商在服务中断方面是否透明。他们通常会有一个状态页面显示正常运行时间。您可以在那里查看哪些服务在何时出现故障。

以 WPMU DEV 状态页面为例进行查看。

最新软件

您的主机提供商(或者如果您自行托管,则由您自己负责)应定期安装软件更新,并替换不再更新的旧软件。这些软件包括 PHP、MySQL 或 MariaDB 以及您的操作系统。所有软件都需要定期更新。

安全协议

您的主机服务商应该具备完善的预防协议,从源头上防止攻击,同时也要有事件响应计划。一旦发生数据泄露,您必须了解所有情况,并及时通知您的用户。这是您的义务,所以如果遇到这种情况,千万不要掉以轻心!

WordPress 安全上下文中的备份

备份

你是否曾遇到过意外删除或丢失数据的情况?你能想象如果丢失一个正在运行的客户网站会发生什么吗?你会怎么做?

在WordPress安全方面,我们会为最坏的情况做备份。例如,如果数据被攻击者加密,或者所有数据都被删除。

数据丢失是最糟糕的事情之一。它不仅会损害您和客户的利益,而且也显得非常不专业。如果您在主机方面没有任何备份策略,那么在任何新的 WordPress 网站上,您应该安装的第一个插件就是备份插件。

如果您想定期备份网站,可能需要使用自动化插件或主机备份解决方案。大多数主机提供商都会为您的 WordPress 网站提供某种备份工具。如果没有,您可以选择插件。

网站备份的间隔时间取决于您更改网站内容的频率。如果您经常在网站上发布内容,我建议每天备份数据库,每周备份文件(除非您经常处理媒体文件,在这种情况下,您也可以每天备份文件)。

本地备份

本地备份是指保存在本地的备份,例如保存在 Web 服务器或可远程访问的存储设备上的备份。

由于本地备份可以直接访问,因此恢复速度很快。本地备份的创建频率应该比异地备份更频繁。

即使您创建了本地备份,仍然应该创建异地备份。

异地备份

备份系统无法直接访问异地备份。这些备份存储在异地,无法直接恢复。在恢复之前,您必须主动从其他位置(例如,外部硬盘)获取备份,并将其放置到要恢复的系统上。

即使您已经有了本地备份,也应该定期创建异地备份。这样,即使出现最糟糕的情况,本地备份遭到破坏,您仍然始终有备份可用。

备份插件

有很多备份插件可用于备份您的 WordPress 网站。

以下是一些热门选项:

它们的功能基本相同,都是备份文件和数据库。您可以根据需要进行配置。

但是,请记住,如果您的网站规模过大(占用空间过大),备份过程可能会大幅降低网站速度,并且备份时间也会很长。如果是这种情况,我建议您在主机托管商处选择可靠的备份解决方案。

托管备份

大多数托管型 WordPress 主机服务都提供某种形式的主机端备份解决方案。根据服务提供商的不同,您可以配置网站整体、数据库、文件甚至整个服务器的备份。

不专门提供 WordPress 服务的托管商通常也会提供备份选项。

以下是一些提供出色备份解决方案的托管服务提供商:

测试备份的完整性

您还应该每隔几个月在测试环境中定期进行恢复,以验证备份的完整性。

更理想的做法是,将备份集成到开发流程中。从开发环境迁移到生产环境或测试环境时,不要手动移动文件和数据库,而是使用备份。这样可以始终确保备份数据的一致性。

WordPress 安全方面的更新

更新

保持 WordPress 网站更新是避免网站被黑客攻击的最关键措施之一。

软件永远不可能完美无缺。信誉良好的开发者会尽最大努力确保软件尽可能避免漏洞。然而,有时仍会发现一些可能损害您网站的危险漏洞。开发者随后会发布更新来修复这些漏洞。

因此,定期更新系统软件至关重要。建立网站更新流程是保障安全的关键。

WAF(我们稍后会详细介绍)可以保护您免受许多此类漏洞的攻击。但是,它并不能替代系统更新。更新通常包含漏洞修复或带来新功能。因此,保持 WordPress 网站更新有很多好处。

您必须确保系统从上到下彻底更新。除了 WordPress 核心程序、插件和主题之外,其他部分也需要更新,例如 PHP、Web 服务器引擎或操作系统本身。

WordPress 提供了自动更新选项。但是,使用此选项时应谨慎。您仅应在小型网站上启用此功能,且该网站安装的插件数量很少,并要求插件在非破坏性更新方面拥有良好的记录。

遗憾的是,您无法仅启用安全更新的自动更新,因为安全更新和功能更新之间没有区别。即使是小版本更新也可能引入破坏性变更(即使这种情况并不常见)。这意味着您必须以相同的方式对待所有更新。因此,请尽量减少 WordPress 网站上的插件和主题数量。

让我们进一步探讨它们。

WordPress核心更新

WordPress 的广泛应用使其成为世界上最安全的软件之一。许多安全漏洞都得到了修复,而这些漏洞在其他不太流行的系统中可能根本不会被发现,或者需要更长时间才能被发现。人越多,发现得越多。

此外,像 Automattic(WordPress.com 的母公司)、WPEngine 等众多大公司都在 WordPress 核心代码上投入巨资,以确保其安全性。这符合他们的自身利益,因为他们也将其作为自身业务的基础。WordPress.com 本质上是一个拥有众多自定义选项和丰富资源的 WordPress 多站点安装版本。

这意味着从安全角度来看,WordPress 核心对我们来说并非太大的问题。然而,安装 WordPress 核心更新仍然非常重要,也是最佳实践。WordPress 一直在不断发展,插件和主题开发者会在某个时候停止对旧版本的支持。这意味着,如果您不更新 WordPress 核心,那么在某个时候,您也将无法更新插件、主题,甚至 PHP 版本。到那时,更新将会变得非常麻烦!

您可以在WPScan 漏洞数据库(以前称为 WordPress 漏洞数据库 – wpvulndb.com)中找到所有已识别的 WordPress 核心漏洞列表。

插件和主题更新

保持插件和主题更新至关重要。大多数插件和主题在开发时并未像 WordPress 核心那样重视安全性,因此它们会形成一个完美的攻击面。

插件和主题中经常会发现严重的安全漏洞,如果你不想在这些漏洞公开后受到其影响,最好定期更新。

请查看“开发者信誉”部分,了解在安装插件或主题之前需要检查哪些方面。

系统更新

如果您选择优质的托管服务,这一点对您来说就不那么重要了。但是,如果您选择自行托管,您还需要管理服务器上所有软件的更新。这包括 PHP、Web 服务器(例如 Apache)、操作系统以及服务器上的所有其他软件。

这就是为什么我建议你选择托管主机解决方案的原因之一,除非你想主动管理底层系统。

HTTPS

HTTPS

如果您访问使用未加密 HTTP 协议的网站,请务必假设您的活动正被监视。切勿在未加密的网站上输入登录凭据。如果您不小心输入了,请通过 HTTPS 连接更改密码。

除了HTTP不安全之外,它还会影响你的SEO。自2014年以来,谷歌已将HTTPS作为排名因素之一。我认为这是显而易见的,因为现在使用HTTPS非常简单,而且安全性更高。

将 WordPress 切换到 HTTPS

如今切换到 HTTPS 相对容易。由于 Let's Encrypt 的出现,完全没有必要再使用 HTTP 进行通信了。如果您还没有切换到 HTTPS,为了您自己和您的访客着想,赶紧切换吧。

获取 TLS 证书

过去那种需要花费数百美元购买证书,并通过命令行安装,然后每隔一年续订,如此反复的日子早已一去不复返了。Let's Encrypt 可以让你生成域名验证的 TLS 证书。借助他们的客户端软件,他们甚至可以自动完成整个流程:申请证书、将其安装到服务器上,并自动续订。现在,许多主机提供商甚至支持一键式操作。而且完全免费。


TLS和SSL有什么区别?

SSL(安全套接字层)是加密协议的旧名称。TLS 于 1999 年首次使用,版本为 TLS 1.0。RIP SSL


绝对 URL 与相对 URL

绝对URL包含域名。而相对URL则不包含域名,因此它们依赖于上下文。

绝对 URL 和相对 URL 示例:

  • 绝对网址:https://omniploy.com/about/
  • 相对网址:/about/

使用相对 URL 时,浏览器会自动引用链接所在的域名。因此,如果域名是 example.com 而不是 omniploy.com,则相对 URL 也将是 https://example.com/about/。

WordPress 和许多插件经常在数据库中使用绝对 URL,因此如果我们想切换到 HTTPS,就必须在数据库中查找并替换协议和域名。

查找并替换 http-URLs 为 https-URLs

根据 WordPress 网站的大小,查找和替换 URL 的过程可能需要很长时间。

请记住,您将直接操作数据库。在对数据库进行查找和替换操作之前,务必先创建完整备份。

大多数情况下,我使用Better Search Replace 插件进行搜索替换,不过,任何搜索替换插件通常都足够用了。关键是你要使用的系统支持序列化。

WordPress 提供了一种以序列化方式将对象保存到数据库的方法。同时,它还会保存数据的长度。这意味着,如果你的 URL 最初是 10 个字符,后来突然变成 11 个字符,那么它必须进行相应的修改,否则数据将失效。

这也是我强烈建议不要对 SQL 文件进行查找替换的原因。理论上,你可以在编辑器中轻松完成查找替换,但是编辑器不会考虑序列化数据,这会导致数据不一致。

以下是一个示例字符串,您应该搜索并替换这些字符串,以将您的 WordPress 网站从 HTTP 切换到 HTTPS:

  • 搜索:http://yourdomain.com
  • 替换为:https : //yourdomain.com

更好的屏幕截图搜索和替换功能

改进 omniploy.com 的屏幕截图搜索和替换功能。
如果您混用了带 www 和不带 www 的版本,也应该进行替换。如果需要,您还可以通过从 URL 中删除(或添加,取决于您的偏好)www 来使链接更加一致。

  • 搜索:http://www.yourdomain.com
  • 替换为:https : //yourdomain.comhttps://www.yourdomain.com
WordPress 5.7+:一键切换

WordPress 5.7 引入了一键切换 HTTPS 协议的功能。但是,此操作不会更新数据库中已替换的 URL。它只会将网站 URL 和首页 URL 切换为 HTTPS,并动态替换后端和前端的 HTTP URL。在迁移到 HTTPS 的过程中,这样做没问题,但数据库仍然需要更新。

此功能更像是一个钩子扩展,允许托管服务提供商或插件开发者接入这些流程并专门执行迁移。这为插件开发者创建迁移解决方案开辟了全新的途径。

HSTS

HTTP 严格传输安全 (HSTS) 可保护您的访客(以及您自己)免受中间人攻击,例如协议降级攻击

例如,当您首次在地址栏中输入 omniploy.com 并访问该页面时,第一个请求通常是纯文本的 HTTP 请求。但是,服务器会响应并重定向到升级后的加密 HTTPS 连接。

HTTPS 升级到 HTTPS 的示例

现在有了 HTTP 严格传输安全 (HSTS),服务器会告诉浏览器,对该域的每个连接都必须在指定的时间段内通过 HTTPS 连接进行。

如果服务器响应的 HTTPS 响应头字段为“Strict-Transport-Security”,则浏览器中将强制执行 HSTS。

我建议您在网站上启用 HSTS,不过现在它的重要性有所降低。许多浏览器(或类似HTTPS Everywhere 的扩展程序)现在默认使用 HTTPS 而非纯文本 HTTP。因此,浏览器无需先发送 HTTP 请求再重定向到 HTTPS 版本,而是直接连接 HTTPS。这使得降级攻击变得更加困难(尽管并非完全不可能)。

用户账户保护

用户账户保护

谈到 WordPress 安全,我们也必须谈到用户账户的保护。本节将讨论密码、用户名、双因素身份验证等等。

强密码

使用强密码是保护用户账户免遭盗用的重要组成部分。黑客通常会采用复杂且自动化的暴力破解攻击来破解密码。

以下是创建强密码的三条规则:

强密码规则#1:复杂

强密码应符合以下规则:

  • 至少 12 个字符长。
  • 包括大写字母和小写字母。
  • 至少一个数字。
  • 至少有一个特殊角色。

强密码规则之二:密码必须唯一

不要重复使用同一个密码。您创建的每个账户都应该设置一个独一无二的密码。这样可以防止一个账户密码泄露后,导致多个账户被盗用。


我的所有密码应该保存在哪里?

没人能记住自己使用的所有密码,尤其是那些复杂且每个账户都不同的密码。我们内部使用1Password,但市面上有很多其他解决方案。务必查看其信誉。


强密码规则#3:未知

绝对不要使用数据库中已有的密码。有些服务允许你将密码与密码数据库进行比对。如果密码在数据库中,就不要使用!

许多密码管理器都会自动检查密码。符合复杂度规则的密码即使被破解也不会造成太大问题。不过,检查密码仍然是个好习惯。

双因素认证 (2FA) / 多因素认证 (MFA)

双因素身份验证或多因素身份验证是一种机制,在这种机制中,您必须输入第二个密码(例如,基于时间的密码)才能获得访问权限。

使用一次性密码 (OTP) 的双人登录表示

多因素身份验证有多种类型,例如基于时间的一次性密码 (OTP)、短信、电子邮件等等。我个人更喜欢基于时间的 OTP,因为它们始终有效,而且是开放标准,可以轻松保存到密码管理器中。

尽量避免使用短信或电子邮件进行双重验证,因为它们通常容易被拦截。

WordPress有很多双因素身份验证(2FA)插件。如果您已经在使用Wordfence或iThemes Security之类的插件,我建议您继续使用它们,因为它们已经内置了双因素身份验证功能,无需安装其他插件。

默认管理员用户名

尽量不要使用默认的管理员用户名,例如“admin”、“wpadmin”、“root”或“administrator”。虽然这并不是要将管理员用户名当作第二密码(因为WordPress 将用户名视为公共信息而非私人信息),但这样做仍然可以有效阻止许多低级机器人进行暴力破解攻击。这些用户名正是大多数试图入侵 WordPress 网站的机器人的目标。建议使用类似“adm1n1strat0r”这样的随机用户名。其实用什么用户名并不重要,重要的是不要使用常见的用户名。

像 Wordfence 这样的插件也提供了禁用用户名选项。如果有人尝试使用这些禁用用户名登录,系统会立即阻止其登录。禁用用户名通常是管理员常用的用户名,例如“admin”、“root”、“wpadmin”等等。

用户名并非用于身份验证,因此不应像密码一样对待。这更像是一种蜜罐攻击策略。

登录次数限制

为了降低 WordPress 网站遭受暴力破解攻击的风险,您应该限制用户的登录尝试次数。这样可以大大增加黑客猜测密码的难度,并提高网站性能,因为在一定次数的尝试后,请求将被阻止。

包含登录限制和屏蔽功能的插件有 Wordfence 和 iThemes Security。不过, WordPress 官方插件库中还有更多类似的插件

正确使用管理员用户

只有在确实需要管理员用户所拥有的权限时才应使用他们。例如,进行维护工作、安装插件或创建用户。但如果您只是创建页面或文章,则应切换到权限更受限的用户角色,例如编辑或作者角色。

借助Members 插件等插件,您可以创建自定义角色,并为其分配完成任务所需的确切权限。

使用具有不同权限级别的不同用户帐户也可以大大降低遭受 CSRF 攻击的风险。

WordPress 安全上下文中的插件和主题

插件和主题在 WordPress 安全方面扮演着重要角色。由于它们和 WordPress 核心一样,都是运行纯 PHP 代码,因此您应该始终检查开发者是否值得信赖。在本节中,我们将讨论在选择插件和主题时需要注意哪些方面,以确保 WordPress 网站的安全。

未使用的插件和主题

不使用的插件和主题应该彻底移除,不要只是停用,而是直接删除。即使插件被停用,其文件仍然可以被直接调用。服务器上的可执行文件越少,攻击面就越小。

您以后随时可以再次安装。

过时和废弃的插件和主题

WordPress.org 上的废弃插件横幅

你可能在 WordPress 插件页面顶部看到过这条信息一两次。我强烈建议你不要使用过时或已停止开发的插件,因为没有人继续维护它们,这意味着你无法获得任何针对后续发现的安全漏洞的补丁。

从长远来看,这甚至可能导致更新受阻。例如,过时的插件依赖于较低的 PHP 版本,而较新的插件甚至 WordPress 核心本身都不再支持该版本。

此外,一旦发现插件开发者停止开发,就应尽快切换到其他系统。

这也是我建议对使用的每个插件都进行信任检查的原因之一。这样做可以大大减少日后出现问题的可能性。

开发商的声誉

正如我们在本 WordPress 安全指南中所了解到的,开发者对我们的 WordPress 网站拥有很大的控制权。信任是其中的关键因素。开发者可以通过更新修改您系统上的代码,这意味着您必须信任插件或主题背后的开发者,相信他们不会做出愚蠢的事情。

安装插件前,你应该问自己以下几个问题:

  • 该插件/主题上市很久了吗?
  • 开发者是否承诺对该插件进行长期支持?
  • 该插件或主题能否为开发者带来收入,以支付费用并使其继续开发变得有意义?
  • 该插件或主题是由公司开发还是由大型社区开发?
  • 该插件或主题过去是否只有极少数安全漏洞?(请查看插件主题的漏洞数据库)
  • 该开发商在响应已报告的漏洞并快速修复方面是否有良好的记录?
  • 开发者在更新插件或主题时,是否有过不破坏现有功能的良好记录?

如果你对这些问题的大部分回答都是“是”,那么你可能可以放心使用该插件或主题。

就像你使用或购买的任何软件一样,你应该先确认你是否信任其背后的开发者。

WordPress 安全上下文中的服务器配置和 wp-config.php

WordPress 安全上下文中的服务器配置和 wp-config.php

网站服务器的配置方式对 WordPress 的安全性影响巨大。由于服务器安全本身就是一个值得探讨的话题,因此本文将重点放在与 WordPress 相关的部分。

在 /uploads 目录中执行 PHP 代码

WordPress 的 /uploads 目录用于存放媒体文件。可执行文件不适合放在这个目录下。为了防止可执行文件即使通过上传过滤也运行,您需要配置您的 Web 服务器引擎(Apache),使其不执行这些文件。

Wordfence 等插件提供了一个简单的选项,可以禁用 /uploads 目录中的执行。

不过,您也可以手动轻松完成此操作。只需将以下代码添加到名为 .htaccess 的文件中,该文件直接位于您的 /wp-content/uploads/ 目录下:

// .htaccess
<IfModule mod_php5.c>
 php_flag engine 0
</IfModule>
<IfModule mod_php7.c>
 php_flag engine 0
</IfModule>
<IfModule mod_php.c>
 php_flag engine 0
</IfModule>

AddHandler cgi-script .php .phtml .php3 .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
Enter fullscreen mode Exit fullscreen mode

这将完全禁用该目录的 PHP 引擎。这与 Wordfence 插件启用该选项后的效果基本相同。

wp-config.php:WordPress 配置

wp-config.php 是 WordPress 相关配置的配置文件。您可以在 WordPress 官方网站上找到关于 wp-config.php 的完整参考文档,以及它提供的默认配置选项。在本安全指南中,我们将从 WordPress 安全的角度来讨论 wp-config.php。

将 wp-config.php 向上移动一个目录

许多 WordPress 用户并不知道,即使将 wp-config.php 文件向上移动一个目录,WordPress 仍然能够找到它。这是一个非常基础但却非常有效的安全措施。通常情况下,wp-config.php 文件应该与其他所有文件位于同一目录下,也就是公共目录。

如果您已经正确配置了所有内容,通常无需担心,因为即使您直接访问 yourwebsite.com/wp-config.php 来调用 wp-config.php,也只会显示一个空白页面。这就是为什么所有配置信息都用 PHP 编写,而不是直接显示在页面上的原因。

然而,如果服务器配置错误,导致返回的文件包含 PHP 代码,就会迅速引发问题。考虑到 wp-config.php 文件中数据的重要性和机密性,我们应该始终考虑将其移出公共区域。这无疑是提升安全性的简单方法。

禁用后端源代码编辑(DISALLOW_FILE_EDIT)

WordPress 有一个主题和插件编辑器,可以直接编辑插件和主题文件。我强烈建议您禁用它。

首先,编辑源文件非常危险。一个错误的字符就可能导致网站宕机。另一个问题是,当插件和主题更新时,对源文件的所有编辑都会丢失,因为插件/主题文件会被覆盖,所有更改都会消失。

我只能想到一种情况下这个后端代码编辑器可能有用,那就是当你有一个子主题,并且需要快速修改它的时候。但即便如此,使用代码编辑器并对更改进行版本控制也是一种良好的实践。而主题和插件编辑器则完全无法做到这一点。

因此,对于 99.9% 的用户,我建议完全禁用代码编辑器。

这很简单。打开 wp-config.php 文件,并添加以下代码行:

// wp-config.php
// Below this line => /* That's all, stop editing! Happy blogging. */
define('DISALLOW_FILE_EDIT', true);
Enter fullscreen mode Exit fullscreen mode

强制后端使用 HTTPS (FORCE_SSL_ADMIN)

如果您的网站使用 HTTPS 通信(理应如此),则应将 FORCE_SSL_ADMIN 选项设置为 true。这将强制所有到后端服务器的流量都通过 HTTPS 传输,并通过设置 cookie 的 Secure 标志来确保 cookie 仅通过 HTTPS 传输。

在wp-config.php文件中添加以下代码,强制后端使用 HTTPS:

// wp-config.php
// Below this line => /* That's all, stop editing! Happy blogging. */
define('FORCE_SSL_ADMIN', true);
Enter fullscreen mode Exit fullscreen mode

使用唯一的安全密钥

WordPress 使用唯一密钥对 cookie 进行签名和加密。这些密钥必须保密,因为攻击者可以利用这些密钥自行生成会话 cookie。如果您按照正常的 WordPress 安装流程或其他自动化安装流程进行操作,这些密钥应该会自动生成。但有时,尤其是在较旧的 WordPress 安装中,密钥可能从未生成,从而导致类似这样的情况:

// wp-config.php
// Never let your config with this
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );
Enter fullscreen mode Exit fullscreen mode

如果你在配置中发现此问题,我强烈建议你生成新的配置(WordPress.org 提供了一个简单的端点来实现这一点),并重置所有密码。

更改数据库前缀($table_prefix)

数据库前缀使您能够通过使用不同的前缀,在一个数据库中运行多个 WordPress 实例。

就 WordPress 安全性而言,我建议你使用随机前缀。

更改数据库前缀是提高新 WordPress 安装安全性的简便方法,只需将数据库前缀更改为除 wp_ 之外的其他值即可。WordPress 在安装过程中会询问您希望使用什么作为数据库前缀。请使用随机值,例如 c3po_。

带有不同前缀的 WordPress 安装屏幕

您也可以稍后更改数据库前缀。不过,我建议您使用插件来完成此操作,并且在更改数据库前缀之前务必创建备份。

像iThemes security这样的插件允许你之后更改数据库前缀。

阻止显示调试信息 (WP_DEBUG_DISPLAY)

如果必须在运行中的网站上进行调试,请不要将调试信息直接显示在屏幕上。调试信息可能包含对攻击者有价值的信息。最好让 WordPress 将信息写入 debug.log 文件。

// wp-config.php
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG', false); // Change this to true if you want to log debug messages.
Enter fullscreen mode Exit fullscreen mode

即使您现在不进行调试,也应该立即将 WP_DEBUG_DISPLAY 选项设置为 false。这样可以避免因忘记关闭调试信息而导致显示任何调试消息。

Web应用程序防火墙(WAF)

Web应用程序防火墙(WAF)

Web应用程序防火墙就像网站的防病毒软件。它位于网站前端,检查是否存在潜在的有害请求。

插件 WAF

典型连接中插件 WAF 的表示

如果您的主机提供商不提供 WAF(WordPress 应用防火墙),您也可以选择插件解决方案。我们最推荐的是Wordfence。除了实时防火墙规则更新和 IP 黑名单之外,它还提供许多其他功能,例如阻止、限速、双因素身份验证等等,可以全面保护您的 WordPress 网站。

不过,我们建议您使用付费版本,因为免费版本的大部分防火墙规则更新(针对新发现的安全漏洞)需要等待 30 天才能生效。这意味着,如果您系统上安装的某个插件检测到漏洞,而您又没有更新该插件,那么您的网站将在 30 天内处于易受攻击的状态,之后才能获得相应的防火墙规则。

不过,我建议您启用扩展保护。这样,Wordfence 可以在 WordPress 加载之前检查请求,从而保护您免受插件和主题攻击。

云 WAF

云端WAF是WordPress网站和访客之间的代理。您无需将域名直接指向服务器,而是将IP地址配置为指向云端WAF。云端WAF会将合法流量转发到服务器并返回。

云端 WAF 的例子有CloudflareSucuri WAF

典型连接中云WAF的表示

独立式WAF

本地服务器 WAF 是一种安装在本地的软件,它会在流量到达 WordPress 网站之前对其进行过滤。

本地服务器 WAF 的一个例子是NinjaFirewall。他们专注于 WordPress 和 PHP。与 Wordfence 在 WordPress 环境中安装插件不同,NinjaFirewall 是在您的 Web 服务器前端部署一个独立的 WAF。另一个例子是Perishable Press 的 7G 防火墙

本地服务器 WAF 的表示

安全插件

安全插件

以下列表并未包含所有 WordPress 安全插件。这些是我们亲自使用和评测过的插件,有了它们,您几乎可以满足 WordPress 安全方面的所有需求。

Wordfence 安防

Wordfence 是我们最喜欢的安全插件。Wordfence 团队专注于 WordPress 安全,他们在识别和修复插件及主题中的漏洞方面做得非常出色。

Wordfence Premium 的价格略高,但如果您想降低压力水平,它绝对物有所值。而且,购买的许可证越多,价格越优惠。Wordfence 的起价为 99 美元,如果您购买 15 个或更多许可证,则每个许可证的价格可降至 75.25 美元。您可以在他们的网站上找到完整的价格列表。

除了专为 WordPress 开发的 WAF 之外,Wordfence 还包含许多其他功能来加强 WordPress 的安全性。以下是 Wordfence 的部分功能列表:

  • 限速
  • 双因素认证 (2FA)
  • 国家封锁
  • 自动恶意软件扫描
  • 蛮力防护
  • 还有更多……

我曾在 WordPress 社区多次听到有人反映,启用 Wordfence 后网站速度变慢。但我无法证实 Wordfence 真的会拖慢网站速度。我认为,如果你的服务器资源非常有限且配置极低,这种情况或许会发生。然而,如果你的主机环境配置合理,应该不会出现问题。

他们还有一个很棒的播客节目,叫做《像黑客一样思考》(Think Like a Hacker),由 Wordfence 出品。他们会讨论最新的安全事件。如果你想了解 WordPress 安全领域的最新动态,我强烈建议你订阅他们的播客。

iThemes 安全

iThemes Security 是一款功能全面的安全软件。它还提供 iThemes Security Pro 版本,进一步扩展了功能。不过,它不提供实时更新的 Web 应用防火墙 (WAF)。

这也是为什么他们能以每年 199 美元的价格提供无限站点套餐的原因。与 Wordfence 不同,他们只销售插件,无需为每个安装的 WAF 提供基础设施。

我仍然认为,iThemes Security 配合插件、云端或独立 WAF,是大幅提升 WordPress 网站安全性的绝佳方式。尤其如果您觉得 Wordfence 的价格太高的话。

其他安全插件

市面上还有很多其他安全插件也能完成这项工作。我用过的插件不多,但它们都出自信誉良好的开发商之手,所以我很乐意推荐它们。

  • WPMU DEV Defender
  • 喷气背包
  • Sucuri Security

应对 WordPress 网站被黑客攻击

应对 WordPress 网站被黑客攻击

到目前为止,我们已经学习了如何保护 WordPress 网站免受恶意攻击。在这一部分,我们将讨论如果网站遭到入侵应该如何应对。制定应对策略有助于减轻压力和恐慌,并缩短响应和阻止攻击所需的时间。

WordPress 安全事件响应计划

WordPress 安全事件响应计划为每个事件定义了 6 个阶段。

让我们从 WordPress 网站开发人员和管理员的角度来看看这些流程。

事件响应#1:准备

永远不要认为自己绝对安全。网站插件或主题中只要存在一个严重的零日漏洞,就可能导致整个系统瘫痪。你应该做好应对此类情况的准备。考虑建立备份系统,并对管理员进行培训,以抵御社会工程攻击。

以下是防范黑客攻击时需要考虑的一些事项:

  • 拥有可靠的备份解决方案,包括本地备份和异地备份。
  • 具备分析日志的能力。
  • 为要求拥有网站管理员权限的客户提供培训。
  • 制定安全策略。明确谁可以在何时执行哪些操作?
  • 已安装恶意软件扫描程序。

应对黑客攻击的关键在于做好准备。这可以降低在紧急情况下惊慌失措的风险,从而让你更快地应对攻击。准备工作往往也决定了你是否能够发现攻击。

如果黑客只是想利用你的网站进行 DDoS 攻击,你可能永远不会知道你的网站已被入侵,或者直到为时已晚才发现。

事件响应#2:识别

为了抵御攻击,首先必须确定攻击目标。这就是日志的作用所在,也是我在准备阶段建议大家建立日志分析机制的原因。日志可以帮助你识别被调用的端点及其有效载荷。

另一种识别攻击的方法是使用恶意软件扫描器。您可以配置恶意软件扫描器每隔几天运行一次,并在发现恶意软件时通知您。例如,Wordfence 就允许您这样做。

此外,还要检查其他网站或系统是否也受到了攻击的影响。如果您已经确定了存在漏洞的部分(例如插件),请检查所有其他系统,如果可以,请禁用该漏洞,以防止这些系统再次受到攻击。

事件响应#3:控制

一旦发现恶意软件,必须立即采取措施加以控制。备份受感染的 WordPress 网站,更改所有安全密钥、API 密钥、密码等。如果可能,将其从网络中移除。更新 Web 服务器上的软件和 PHP 版本。

你想尽一切办法控制局面。

事件响应#4:根除

控制住风险后,需要根除根本原因。这可能包括移除不安全的插件、更改泄露的密码、更新过时的软件等等。

你还需要检查是否安装了后门。黑客正是利用这一点,在你修复初始漏洞或进一步控制你的系统时才会这样做。

事件响应#5:恢复

如果可能,请将清理后的网站迁移到全新且已更新的服务器上。重新上线后,务必确保您的网站已做好安全防护,防止再次遭受攻击。

您是否已更改被入侵网站的所有密码和 API 密钥?您是否已删除攻击者创建的所有未知用户帐户?网站核心、插件和主题是否均为最新版本?

此外,还要确定您希望密切监控已恢复的 WordPress 网站多长时间。

现在也是时候提升和加强 WordPress 网站的安全性了。引入 Web 应用防火墙 (WAF)、双因素身份验证 (2FA)、更严格的密码策略以及软件使用策略。检查所有使用的插件和主题,如果它们不符合这些新策略,请将其替换为其他产品。

事件响应#6:经验教训

如果漏洞是由插件或主题引起的,请通知开发者。他们应该尽快修复问题,以防止其他 WordPress 网站遭受攻击。

如果您的访客或用户的任何个人信息遭到泄露,在大多数国家/地区,您有义务向有关部门报告此类事件并通知受影响的人员。日志可以帮助您识别泄露的数据。

此外,还要问问自己,将来应该如何改进才能避免此类情况再次发生。例如,在客户网站遭受社交工程攻击后,要检查是否需要加强对客户的培训。

即使你永远用不到这个应急预案,也应该准备一份。它能减轻你的压力,也能让你在对待客户时显得更加专业。

WordPress 安全环境中的反模式

一些 WordPress 安全反模式在业内仍然被实践和教授。反模式指的是那些无效甚至适得其反的解决方案,它们通常是在问题出现后才采取的应对措施。本节包含一些个人观点,请阅读后自行决定是否采用这些方法。

隐蔽带来的安全感

我认为“隐蔽式安全”并非良策,至少对于 WordPress 网站而言是如此。原因有三:一是它对网站安全影响甚微;二是它可能导致某些插件或主题出现问题;三是它可能会给人一种虚假的安全感。

有些插件会试图隐藏你的网站运行在 WordPress 上的事实。它们通过移除所有可能暴露你网站使用 WordPress 的信息来实现这一点,例如更改默认的 /wp-admin 路径,或者移除 WordPress 的元标签。

然而,这可能会导致其他插件或主题出现问题,因为它们需要这些数据。此外,每个在前端加载内容的插件都可以通过其独特的指纹识别其是否为 WordPress 插件。

不要依赖隐蔽性来获得安全。

这样做付出的代价太大了。正如我所说,你必须检查每个插件和主题,看它们是否在前端留下了任何可能暴露你 WordPress 安装的漏洞。而这一切又是为了什么呢?仅仅为了让别人知道你使用的是 WordPress 吗?不值得。如果你遵循上述规则,你的安全就已经得到了保障。

登录表单上的验证码

如果您已阅读过关于保护用户帐户的章节,那么您应该已经能够很好地抵御常见的登录攻击。在登录表单中,验证码只会给您和用户带来不便,却没有带来多少实际好处。此外,如果您选择使用 reCAPTCHA,您还会免费向 Google 发送宝贵的数据。

验证码适用于联系表单、注册表单等,但不适用于登录表单。

其他优秀的 WordPress 安全相关资源

其他优秀的 WordPress 安全相关资源

WordPress 安全并非一劳永逸,您需要时刻关注。只有这样,您才能及时了解并应对新的安全问题。

博客和网站

网上还有许多其他优秀的博客和网站介绍了 WordPress 安全方面的知识。

播客

安全类播客非常棒,可以让你及时了解安全相关话题以及世界正在发生的事情。我特别喜欢在上班通勤路上或者做家务的时候听。

文章来源:https://dev.to/tfm-it/wordpress-security-handbook-2021-14ek