WordPress 安全作为一个过程
已发表: 2022-03-10(本文由 Sucuri 友情赞助。) WordPress 安全性没有很好的声誉。 根据 Alexa 对 +40.000 个 WordPress 网站所做的研究,超过 70% 的 WordPress 网站都存在某种漏洞。 如果你开发 WordPress 主题或插件——或者在你的网站上使用 WordPress——这个数字应该会吓到你。
你可以做很多事情来确保你不是 70% 的一部分,但这比安装插件或转义字符串需要更多的工作。 本文中的很多建议都来自 Sucuri 的 WordPress 安全指南和多年的个人经验。
WordPress不安全吗?
WordPress 在内容管理系统中拥有最大的市场份额,在网络上最受欢迎的 1000 万个网站中占有 30% 的市场份额。 这种成功使其成为黑客的大目标。 WordPress 的安全性并不低于其他内容管理系统——它只是更成功。
不到 10% 的 WordPress 黑客攻击是 WordPress 核心中的漏洞造成的。 其中大部分来自过时的 WordPress 安装。 发生在 WordPress 核心最新版本中的实际安全漏洞(也称为零日漏洞)的黑客攻击数量仅占所有黑客攻击的一小部分。
其余受感染的站点是由插件、主题、托管和用户引起的。 作为 WordPress 网站开发人员,您可以控制所有这些。 如果这对您来说似乎很麻烦,那么我可以推荐 Sucuri 的代理计划。 否则,让我们自己找出如何处理 WordPress 安全性!
谁在攻击你,为什么?
让我们首先打破一个神话:小型 WordPress 网站仍然是黑客的有吸引力的目标。 基于个人的攻击非常罕见。 大多数被黑的 WordPress 网站都会被机器人或僵尸网络自动入侵。
机器人是不断搜索要入侵的网站的计算机程序。 他们不在乎你是谁; 他们只是在你的防守中寻找弱点。 僵尸网络结合了许多机器人的计算能力来处理更大的任务。
黑客主要是在寻找进入您的服务器的方法,以便他们可以使用您服务器的计算能力并将其释放到其他目标或目标上。 黑客出于以下原因想要您的服务器。
发送垃圾邮件
垃圾邮件约占所有电子邮件的 60%,它必须从某个地方发送。 许多黑客希望通过有缺陷的插件或旧版本的 WordPress 核心进入您的服务器,以便他们可以将您的服务器变成垃圾邮件机器。
攻击其他网站
分布式拒绝服务攻击使用多台计算机以无法跟上的大量流量淹没网站。 这些攻击很难缓解,尤其是在正确处理的情况下。 闯入您服务器的黑客可以将其添加到服务器池中以攻击网站。
窃取资源
挖矿加密货币现在非常流行,但需要大量的计算能力。 不想在服务器场上花费大量资金的黑客会闯入未受保护的 WordPress 网站并获得对服务器或网站访问者的访问权并窃取计算能力。
提高 SEO 分数
WordPress 的一个特别流行的黑客攻击是访问其数据库并在每个帖子下方添加一堆(隐藏)文本,链接到另一个网站。 尽管谷歌对这种行为越来越警惕,而且黑名单也在增加,但这是一种提高 SEO 分数的非常快速的方法。
### 窃取数据
数据很有价值,尤其是当它与用户资料和电子商务信息相关联时。 获取这些数据并将其出售可以使攻击者获得可观的利润。
为什么安全很重要?
除了不让犯罪分子满意之外,还有很多原因可以说明您的网站在默认情况下应该是安全的。 我自己清理并处理了很多 WordPress 黑客攻击,我可以肯定地说它们永远不会在方便的时候发生。 清理可能需要几个小时,并且会花费您或您的客户的钱。
要让被黑的 WordPress 网站重新启动并运行,您需要删除和替换所有第三方代码(包括 WordPress 核心); 逐行梳理您自己的代码和服务器上的所有其他文件夹,以确保它们仍然干净; 检查未经授权的用户是否获得了访问权限; 并替换 WordPress、服务器和数据库中的所有密码。
大量服务可以为您清理 WordPress 网站,但从长远来看,预防要好得多。
除了清理成本外,黑客还可能在错过销售或潜在客户方面付出很多代价。 黑客会降低您的搜索排名,从而减少访问者和转化次数。
不仅仅是财务成本,被黑客入侵还会损害您的声誉。 访问者访问您的网站是因为他们信任您。 被黑客入侵会损害您的声誉,并且需要很长时间才能修复。
也存在法律问题的真正可能性,特别是如果您在欧盟有客户,GDPR 立法将于 2018 年夏季生效。新立法包括对未妥善处理的数据泄露处以巨额罚款。
金钱、声誉和法律问题:糟糕的安全性会让您付出很多代价。 花一些时间以安全的心态建立您的网站、代码和团队肯定会得到回报。
让我们找出如何防止所有这些讨厌的事情发生。
中央情报局三合会
CIA 三元组是每个数字安全项目的基本框架。 它代表机密性、完整性和可用性。 CIA 是一套规则,用于限制对正确方的信息访问,确保信息可信和准确,并保证对信息的可靠访问。
对于 WordPress,CIA 框架归结为以下内容。
保密
确保登录的用户分配了正确的角色,并且他们的能力得到了检查。 只为用户提供他们需要的最低访问权限,并确保管理员信息不会泄露给错误的一方。 您可以通过强化 WordPress 的管理区域并小心使用用户名和凭据来做到这一点。
正直
在您的网站上显示准确的信息,并确保您网站上的用户交互正确发生。
在前端和后端都接受请求时,请始终检查意图是否与实际操作匹配。 发布数据时,请始终使用清理和转义来过滤代码中的数据以查找恶意内容。 确保使用 Akismet 等垃圾邮件保护服务删除垃圾邮件。
可用性
确保您的 WordPress、插件和主题是最新的,并且托管在可靠的(最好是托管的)WordPress 主机上。 每日自动备份还有助于确保您的网站始终可供公众使用。
这三个元素相互依赖以获得支持。 如果用户的机密密码很容易被盗或被猜到,代码完整性将无法自行发挥作用。 所有方面对于稳固和安全的平台都很重要。
安全是一项艰巨的工作。 除了可以在代码中完成的工作之外,这个框架还有一个巨大的人为因素。 安全是一个持续的过程; 不是一个插件就能解决的。
第 1 部分:诚信——不信任任何事物
验证用户操作的意图以及您正在处理的数据的完整性。 把你内心的嬉皮士扔到门外。 网上没有任何东西可以信任,因此请仔细检查您所做的一切是否存在恶意意图。
数据验证和清理
WordPress 擅长处理数据。 它确保每次交互都经过验证,并且每一位数据都经过清理,但这仅在 WordPress 核心中。 如果您正在构建自己的插件或主题,甚至只是检查一段第三方代码,那么了解如何做到这一点至关重要。
//Cast our variable to a string, and sanitize it. update_post_meta( $post->ID, 'some-meta', sanitize_text_field( (string)$_POST['some-meta'] ) ); //Make sure our variable is an absolute integer. update_post_meta( $post->ID, 'some-int', absint( $_POST['int'] ) );
在此示例中,我们使用 update_post_meta 将两条数据添加到 WordPress 帖子中。 第一个是字符串; 因此,我们将其转换为 PHP 中的字符串,并使用sanitize_text_field
不需要的字符和标签,这是 WordPress 的众多清理功能之一。
我们还在该帖子中添加了一个整数,并使用 absint 来确保这是一个绝对(非负)整数。
使用诸如update_post_meta
之类的核心 WordPress 函数比直接使用 WordPress 数据库更好。 这是因为 WordPress 会检查需要存储在数据库中的所有内容以进行所谓的 SQL 注入。 SQL 注入攻击通过您网站上的表单运行恶意 SQL 代码。 该代码操纵数据库,例如,破坏一切、泄露用户数据或创建虚假管理员帐户。
如果您需要使用自定义表或在 WordPress 中执行复杂的查询,请使用原生 WPDB 类,并在所有查询上使用prepare
函数来防止 SQL 注入攻击:
$tableName = $wpdb->prefix . “my_table”; $sql = $wpdb->prepare( “SELECT * FROM %s”, $tableName ); $results = $wpdb->get_results( $sql );
$wpdb->prepare 会检查每个变量以确保没有 SQL 注入攻击的机会。
逃跑
转义输出与清理输入一样重要。 在保存数据之前验证数据很重要,但您不能 100% 确定它仍然是安全的。 什么都不相信。 WordPress 使用大量过滤器来启用插件和主题来动态更改数据,因此您的数据也很有可能通过其他插件进行解析。 在将数据添加到主题或插件之前转义数据是明智之举。
转义主要是为了防止跨站点脚本(XSS)攻击。 XSS 攻击将恶意代码注入您网站的前端。 转义数据的另一个好处是您可以确保您的标记在之后仍然有效。
WordPress 有很多转义功能。 这是一个简单的例子:
<a href=“<?php echo esc_url( $url );?>” title=“<?php echo esc_attr( $title );?>”><?php echo esc_html( $title );?></a>
尽可能晚地逃跑。 这可确保您对数据拥有最终决定权。
保护请求
如果您启用了 SSL 并且您有一个不错的主机,那么 WordPress 管理员请求已经非常安全,但是仍然存在一些漏洞。 您需要检查用户的意图并验证传入请求是由实际登录用户完成的。
WordPress 使用随机数验证意图。随机数(或“仅使用一次的数字”)并不是 WordPress 中此 API 的准确描述。 它不仅使用数字,而且更像是跨站点请求伪造 (CSRF) 令牌,您可以在每个现代 Web 框架中找到它。 这些令牌确保黑客无法重复请求。 它不仅仅是一个随机数,但 WordPress 喜欢向后兼容,所以这个名字就被保留了下来。
随机数与用户提出的每个易受攻击的请求一起发送。 它们附加到 URL 和表单,并且在执行请求之前始终需要在接收端进行检查。 您可以将 nonce 添加到表单或 URL。 这是表单中使用的示例:
<form method= “post”> <!-- Add a nonce field: --> <?php wp_nonce_field( 'post_custom_form' );?> <!-- other fields: → ... </form>
在这种情况下,我们只是使用简单的辅助函数wp_nonce_field()
,它为我们生成两个隐藏字段,如下所示:
<input type="hidden" name="_wpnonce" value="e558d2674e" /> <input type="hidden" name="_wp_http_referer" value="/wp-admin/post.php?post=2&action=edit" />
第一个字段通过使用生成的代码和我们传递给函数的'post_custom_form'
字符串来检查意图。 第二个字段添加了一个引用来验证请求是否来自 WordPress 安装。
在表单或 URL 的另一端处理任务之前,您将使用wp_verify_nonce
检查 nonce 及其有效性:
if( wp_verify_nonce( $_REQUEST['_wpnonce'], 'post_custom_form' ) == false ){ wp_die( “Nonce isn\'t valid” ); }
在这里,我们用我们的动作名称检查随机数,如果不匹配,我们停止处理表单。
第三方代码
第三方插件和主题是黑客的温床。 在确保您的网站安全时,它们也是最难破解的问题。
大多数 WordPress 黑客攻击是由 WordPress 的插件、主题和过期副本引起的。 没有任何软件是 100% 安全的,但是那里的许多插件和主题要么有一段时间没有被他们的开发人员更新,要么一开始就不安全。
更少的代码意味着更少的黑客攻击。 所以,在安装另一个插件之前,问问自己是否真的需要它。 有没有其他方法可以解决这个问题?
如果您确定需要插件或主题,请仔细判断。 浏览 WordPress 的插件目录时,请查看评级、“最后更新”日期和所需的 PHP 版本。 如果您找到了您要查找的内容并且一切似乎都正常,请在受信任的安全博客(例如 Sucuri 或 WordFence)上搜索任何提及它的内容。
另一种选择是扫描代码并确保它包含适当的随机数、卫生和转义; 这些通常是编写良好且安全的代码的标志。 您不必了解 PHP 或进行完整的代码审查。 验证正确使用 WordPress 安全功能的一种简单快捷的方法是在插件的代码中搜索这些字符串:
-
esc_attr
-
esc_html
-
wp_nonce_field
-
wp_nonce_url
-
sanitize_text_field
-
$wpdb->prepare
如果插件不包含所有这些字符串,它仍然是安全的,但如果没有找到或找到这些字符串的数量很少,那就是一个危险信号。 如果您确实发现了漏洞,请私下与创建者分享,并让他们有时间修复它。
借助 wpvulndb 等计划,跟踪 WordPress 插件空间中的漏洞变得越来越容易。
注意:那里的一些主题将插件版本与其代码捆绑在一起。 这是 WordPress 没有很好的开箱即用依赖管理的一个症状,但它也是一个写得很糟糕的主题的标志。 始终避免使用这些主题,因为它们包含无法更新的代码库。
主题和插件很少包含仅由一位开发人员编写的代码。 Composer 和 NPM使得依赖其他库变得如此容易,以至于它已成为流行的攻击媒介。 如果您正在下载一个简单的 WordPress 主题或插件,这真的不是问题,但如果您正在使用使用 Composer 或 NPM 的工具,那么检查它们的依赖关系并没有什么坏处。 您可以使用 SensioLabs 提供的免费命令行界面 (CLI) 工具检查 Composer 依赖项。 Snyk 之类的服务(您可以免费使用,但也有高级选项)使您能够检查项目中的每个依赖项。
第 2 部分:可用性:保持简单
您的主要目标是让您的网站不受干扰地在线。 即使拥有一流的安全性,您仍然可能会遇到麻烦。 发生这种情况时,出色的备份将为您省去很大的麻烦。
更新
没有更新就不能存在开源。 大多数对 WordPress 网站的攻击都发生在核心软件或插件的过时版本上。 WordPress 核心的安全更新现在会自动处理(除非你禁用了它,你这个怪物!),但插件中的安全更新是另一回事。
使用流行的、受信任的插件进行更新通常是安全的,但所有插件都应在它们在您的网站上上线之前进行测试。 诸如 WP CLI 之类的工具使更新一切变得更加容易。 WordPress 首席开发人员 Mark Jaquith 有一篇非常棒的博客文章,介绍了自动逐步更新所有插件,以便您可以过滤掉可能的错误。
用户、角色和能力
CIA 三合会中的“可用性”与正确掌握信息有关。 我们的主要优先事项是限制后端用户的能力。 不要给每个人一个管理员帐户。
WordPress 中的管理员帐户异常强大。 vanilla WordPress 中甚至还有一个选项可以从 WordPress 管理员帐户中更改您的完整代码库。 (如果这对您来说是新的并且您还没有禁用它,请这样做。)
WordPress 中的角色和能力系统功能强大,并且很容易在代码中进行更改。 在使用 WordPress 时,我创建了很多新角色。 这样做的主要好处是您可以完全控制各种用户可以访问系统的哪些部分,但另一个巨大的好处是它可以防止第三方代码更改 WordPress 核心的标准功能。
电子邮件
WordPress 通常通过它所在的服务器处理电子邮件,但这会使您的所有电子邮件完全依赖于它所运行的服务器。 使用 SMTP 服务防止您的电子邮件被截获并被视为垃圾邮件。 许多插件选项可用于确保您的所有邮件都通过安全的 SMTP 连接发送。
但是,您需要访问域名的 DNS 设置才能添加发件人策略框架 (SPF) 记录。 所有好的 SMTP 服务都会提供需要添加的准确记录。 SPF 记录可确保域授权您的 SMTP 服务以它的名义发送电子邮件。
监控
在线监控您的网站是一项可以完全自动化的 24/7 任务。 对于 WordPress,我们对正常运行时间和文件完整性感兴趣。
监控正常运行时间通常是一个好的主机会为你做的事情。 Uptime Robot 等工具增加了更多安全性。 您的前 50 个网站完全免费。
关于文件完整性,如果黑客获得对您服务器的访问权限,他们可以更改您的代码。
在这种情况下,插件可以解决您的问题。 Sucuri 有一个很棒的审计插件。 它会根据已知恶意代码的庞大数据库检查您安装中的所有文件。 它还会检查 WordPress 核心是否仍然是 100% 的 WordPress 核心,如果存在漏洞,它会提醒您,以便您尽快修复它。
备份
每个安全过程的最终故障保护是自动备份。 大多数优秀的主机都会为您执行此操作,但如果您的主机不提供备份,还有其他不错的选择。 Automattic 制作了一个名为 VaultPress 的工具,并将 BackupBuddy 等工具备份到 Dropbox 帐户或 Amazon S3 存储桶。
WordPress 备份空间中的大多数可靠服务要么是高级服务,要么是高级插件。 根据您是否需要完全控制数据,您可能更喜欢云主机附带的插件,而不是服务。 不过,任何一个都值得每一分钱。
托管
WordPress 不是您服务器上运行的唯一软件。 当你在糟糕的主机上时,大量的攻击向量是开放的。 事实上,糟糕的托管是 WordPress 仍然支持过时版本的 PHP 的主要原因。 在撰写本文时,WordPress 自己的统计页面报告说,所有 WordPress 安装中有 32.5% 运行在不再接收安全更新的 PHP 版本上。
请注意,将近 60% 的安装在 PHP 5.6 和 7.0 上运行,它们将在今年年底之前收到安全补丁。
但是,托管不仅对于使服务器软件保持最新很重要。 一个好的主机将提供更多服务,例如自动每日备份、自动更新、文件完整性监控和电子邮件安全。 托管 WordPress 主机和为您提供具有数据库访问权限的在线文件夹的主机之间存在很大差异。
最好的建议是找到一个体面的托管 WordPress 主机。 它们的成本略高,但它们为您的 WordPress 网站提供了一个很好的支柱。
第 3 部分:保密
如果您已确保您的代码库尽可能安全,并且您在一个出色的 WordPress 主机上,被恶意软件扫描程序和备份所包围,那么您仍然会遇到安全问题,因为人是最糟糕的… 在互联网安全方面。
保密是关于教育你自己、你的客户和网站的用户。
机密数据
您可能不知道,但您的插件和主题可能会显示有价值的机密数据。 例如,如果您将WP_DEBUG
设置为true
,那么您将向每个黑客展示您网站在服务器上的根路径。 调试数据不应该在您的生产网站中占有一席之地。
另一个有价值的数据源是评论和作者页面。 这些充满了用户名,甚至电子邮件地址。 黑客可以将这些与弱密码结合使用来进入您的网站。 警惕你向外界展示的东西。
另外,请仔细检查您是否已将wp-config.php
放入.gitignore
中。
不要单独编码
防止大量错误潜入代码库的一种方法是练习结对编程。 如果你一个人,这要困难得多,但有许多在线社区愿意进行快速代码审计。 例如,WordPress 使用 Slack 来传达有关其平台开发的所有信息。 你会发现那里有很多愿意提供帮助的人。 速度较慢但更好的选择是 WordPress 论坛、StackOverflow 和 GitHub 问题,您的问题(和他们的答案!)会保存在那里,以便其他人可以从中受益。
征求意见可能很困难,但人们喜欢展示他们的专业知识,而 WordPress 总体上拥有一个非常开放和热情的社区。 关键是,如果您从不要求输入代码质量,那么您将不知道您的代码是否安全。
登录名和密码
您的客户需要登录 WordPress 来管理他们的内容。 WordPress 核心尽其所能防止弱密码通过,但这通常还不够。
我建议为您的网站添加一个用于双重身份验证的插件,并限制登录尝试。 更好的是,完全取消密码并使用魔术链接。
信任但要验证
到目前为止,在本文中,我们还没有讨论过社会工程学。 这是一种正在获得动力的黑客形式,但它通常不用于入侵 WordPress 网站。 但是,这是在考虑安全性的情况下围绕您的网站建立文化的绝佳方式。 那是因为对抗社会工程的最佳防御是“信任但验证”。
每当客户、用户或您的老板要求与安全相关的事情时,处理它的最佳方法是信任,但首先要验证他们所说的是否属实。
客户可以声称他们需要管理员访问 WordPress,但您的工作是验证这是否属实。 他们真的需要访问权限,还是他们的角色只缺少一项功能? 有没有办法在不增加新的攻击向量的情况下解决这个问题?
当涉及到安全问题时,“信任但验证”是一个简单而有效的口头禅,它确实可以帮助人们加快速度。
结论
WordPress不安全吗? 不,这不对。 WordPress 核心不断更新和修复,大多数报告的 WordPress 黑客攻击并非来自 WordPress 本身。 围绕 WordPress 的文化是否不安全? 完全正确!
但是,如果您编写的每一行代码、添加的每个用户、启用的每个插件以及支付的每笔托管费用都考虑到安全性,您至少可以确保您正在运行一个安全的网站,从而保持您的声誉和您的数据安全。