支持Laravel.io的持续发展 →

不要在安全上省钱:向您的Web应用添加这些必备功能

2023年1月11日 阅读时间:12分钟

介绍

作为Web开发者,我们通常都 pretty security-conscious 并意识到糟糕的安全实践的潜在危险。我们知道我们需要预防SQL注入、CSRF攻击、XSS脚本攻击等。然而,这些通常是用户不知道背景中的安全功能。

所以在这篇文章中,我们将采取一种略有不同的方法,从用户完全了解并可以与之交互的层面,高屋建瓴地探讨一些安全功能。我们将讨论的功能可以有助于

  • 鼓励我们的用户保持安全意识
  • 帮助我们的用户在安全实践方面发挥主动作用
  • 让用户对我们的安全实践给予信心

提供多因素认证

您可以为应用程序添加的一项优秀安全功能是MFA(多因素认证),这意味着用户在登录时必须提供多个认证因素。您有时也可能会看到2FA(双因素认证)这一术语,它专门指的是使用了两个认证因素。

不深入具体细节,"因素"是一种用于证明您身份的认证类型,用于登录系统。您最熟悉的一种因素类型是密码,它属于"你知道的某物"这一类别。

因素通常分为以下5个类别

  • 你知道的某物 - 例如密码,或PIN。
  • 你拥有的某物 - 硬件认证,例如YubiKey,或由物理设备生成的令牌。
  • 你是什么人 - 生物识别,如指纹或面部扫描。
  • 你在哪里 - 例如检查你通常登录账户的地理位置。
  • 您的操作 - 例如,在屏幕上执行只有您才懂的某些动作。

通常情况下,在启用多因素认证的Web应用程序中登录账户时,您通常需要输入您的密码(您知道的某些信息)然后被要求提供额外的因素(通常是您拥有的或您是的那种东西)。在大多数Web应用程序中,第二个因素可能是一个代码/令牌(您拥有的)。根据应用程序的不同,您可能需要提供使用身份验证器应用程序(如Google Authenticator)生成的代码,或者它可以通过短信或电子邮件发送给您。顺便说一句,对于阅读此处的Laravel开发者,如果您有兴趣从应用程序通过短信发送这些代码,可以查看我的在Laravel中使用Vonage发送短信(之前是Nexmo)文章。

在某些应用程序中,我还看到硬件认证功能的可用性。如果您想将YubiKey设置为额外的因素,这将非常方便。

使用多个因素的好处是减少了有人通过单个因素获得您账户访问权限的可能性。例如,假设一份泄露的密码列表正在互联网上传播,并有恶意行为者获得了一份。如果他们试图仅使用您的密码登录您的账户,如果没有设置MFA,他们将能够获取访问权限。但如果有MFA启用,他们只能完成认证过程的一半。如果没有访问到诸如您的手机、电子邮件账户或令牌生成器(有时银行提供以生成代码),他们将无法获取完全访问权限。

因此,通过在您的应用程序中为用户提供MFA功能,我认为您可以在用户心中树立信心,让他们知道您认真对待他们的安全。这也可以给他们一种额外的信心,即有人尝试进入他们的账户时,他们的数据很可能会保持安全。

然而,您需要注意的是,如果您提供某种形式的MFA,您可能还希望提供一些恢复功能,例如一次性使用恢复代码。这些恢复代码可以在首次设置MFA时由用户下载并存储在类似USB驱动器的东西上。恢复代码在某个因素无法访问时作为备份。例如,假设您的用户使用Google Authenticator作为其第二个因素。如果他们丢失了电话,这意味着他们将完全失去对账户的访问权限。因此,通过允许他们使用他们存放在安全地点的一些恢复代码,他们仍然可以获得访问权限。

发送可疑活动通知

您可以在应用程序中添加的另一项有用安全特性是,当您检测到与账户相关的任何可疑活动时向用户发送通知。

例如,您可以向用户发送电子邮件或短信,如果用户从之前登录过的地方以外的位置登录。

虽然用户从不同的位置登录并不总是有问题,但它可以用作警告用户,如果这是恶意黑客获取用户账户访问权限的话。

提供会话管理特性

在上面的观点中,您的应用程序还可以实现某种形式的会话管理。例如,这可以是应用程序中的页面,显示所有当前的认证会话。它可以显示每个会话的信息,例如位置、浏览器、操作系统、设备类型和IP地址。但重要的是要记住,一些信息可能会被欺骗,因此不应将其视为绝对真理,而应将其视为给用户的指示。

会话管理还可以提供给用户手动销毁单个会话或一次性销毁所有会话的功能。我曾经在使用朋友电脑登录我的Facebook账号后忘记注销而亲身使用了这一功能。所以我回到家后,我能够手动销毁会话,从而签出。这意味着我可以主动加强账户安全,而不是希望我的朋友不会做出恶作剧(或者是恶意行为)!

记录用户活动

根据你正在构建的应用类型,将用户的操作记录到审计日志中可以用作有用的安全特性。

首先,这可能很有用,因为用户可以利用日志发现任何可疑活动,表明其账户可能已被恶意黑客入侵。

审计日志还可能在(希望不会发生,不太可能)账户被入侵的事件中被使用。它可以使用户在事后调查黑客可能在系统中做了什么。他们是否窃取了任何用户数据?是否下载了任何报告?是否有客户信息丢失?

你在活动日志中记录的内容将根据你的应用程序而有所不同,但你可能想跟踪以下事件:

  • 成功登录。
  • 可疑登录。
  • 多次尝试登录失败。
  • 下载了报告和用户数据。
  • 用户信息(如电子邮件地址)的变更。
  • 他们可能创建、更新或删除的数据实体。

当用户更改电子邮件时发送电子邮件

在应用程序中,你还可以实现的另一个实用安全功能是在用户更新电子邮件地址时发送电子邮件。你可以向当前电子邮件地址和新地址发送电子邮件,告知他们正在更新你的应用程序。

用户可能只是将电子邮件地址更新到一个新的地址。然而,拥有此功能可以帮助用户警告如果恶意黑客已经进入系统并尝试将其更新到另一个地址锁定用户。

根据此功能的实现方式,你甚至可以在这些电子邮件中添加确认链接,让用户确认他们希望更新地址。然而,此功能的特定部分可能会在用户更新地址时引起问题,因为他们可能无法访问系统中当前已有的电子邮件账户。因此,这需要根据项目性质进行思考。

同样,你也可以实现此功能以确保用户了解他们的手机号码也已被更新。

当用户密码被重置时通知

你可能还希望在用户的密码被重置时提醒他们。

类似于上述其他安全功能,这可以发送电子邮件或短信给用户,每当他们的密码被更新时。这意味着如果恶意黑客获取了对账户的访问权限并试图锁定用户,用户可以立即获得警告。

检查受损害的密码

在实现注册表单和密码重置表单时,你可能想使用Have I Been Pwned API。通过集成此API,您可以检查用户输入的密码是否可以找到任何已知的受损害密码列表。

这意味着您可以主动通知用户,如果他们的密码不再安全,以防止他们用这个密码注册。这不仅有助于用户,还可以为您自己减少支持工单提供一个方便的方法。在用户账号遭到入侵的情况下,他们可能会向您寻求支持,所以通过降低发生这种情况的可能性,您可以减少回复支持工单的时间,并继续为您的应用程序构建酷炫的新功能。

有关如何使用Have I Been Pwned API的详细信息,我建议您在此查看他们的API文档

定期检查最新信息

如果您使用GitHub,您可能会在定期登录时注意到显示的提醒。这个提醒通常会要求您核实所有信息是否最新,例如您的电子邮件、备用电子邮件、电话号码、两步验证方法和恢复代码。

您还可能在系统中实施类似的功能。这将允许用户自己检查他们的安全性并提醒他们保持信息最新。例如,让我们假设一个用户得到了一个新的电话号码,但忘记了在本系统中更新信息。通过向用户展示一个包含他们当前安全信息的模态窗口或页面,可以提醒他们更新他们之前忘记更新的电话号码。

根据您的应用程序,您可能想定期实施此功能,例如每月、每3个月或每5次登录一次。

允许按粒度权限控制API令牌

在我负责的许多实施了权限的项目中,我发现通常API权限是被忽视的。通常,我发现大量精力被投入到实现用于Web UI的角色和权限系统,但同样精力没有投入到API中,因为“没有人会真正使用它,除了几个客户端”。这可能会让你陷入一个非常糟糕的情况,知道API中存在一个显而易见的漏洞。

所以,确保在API中实施了正确的角色和权限检查是非常重要的,以确保用户只能访问他们应有的访问权限。

为了进一步提高此功能,添加具有细粒度作用域/权限的多个API令牌的能力可以非常强大。例如,如果您曾为GitHub创建新的API令牌,您会看到页面上的复选框,允许您选择该API令牌可以执行的操作。例如,您可能想要一个只能读取数据的令牌。或者,您可能想要一个只能创建和删除数据实体的令牌,但不能删除它们。

允许用户创建只能执行特定操作的令牌可以鼓励他们遵循“最小权限”原则。事实上,我曾在Battle Ready Laravel中讨论过这个问题,我认为它可能非常有帮助。所以,用户不需要在系统中为他们自己的账户拥有一个单一的“主”令牌,他们可以创建多个具有特定目的的API令牌。

作为一名开发者,我可以肯定地说,能够这样做是一个让我感到非常放心的特性,我喜欢使用它,因为它给了我这样的信心:如果单个API令牌被泄露,后果将会受到限制。这意味着不是该API令牌能够访问API的每一个部分,它们只能访问令牌创建时的那个部分。

如果您想进一步操作,通过使用多个令牌,您可以添加类似于“会话管理”的功能,用户可以手动使令牌过期,以防止它们被使用。如果您实现了活动日志,您还可以记录执行特定操作的API令牌,以帮助提高审计记录的质量。

结论

希望这篇帖子可以给您对自己网络应用中可以提供的一些不同功能以改善用户安全的简要概述。

如果您喜欢阅读这篇帖子,我很乐意听到您的意见。同样,如果您有任何改进未来帖子的反馈,我也很乐意听到。

您可能还对我的220多页的电子书 "Battle Ready Laravel"感兴趣,它更深入地覆盖了类似主题。

如果您想每次发表新帖子时都收到更新,请随时注册我的通讯简报

继续构建奇妙的东西!🚀

上次更新1年前。

由driesvints、ktanaug21、vasotelvi、elkdev喜欢此文章

4
喜欢这篇文章? 让作者知道并给予他们掌声!
ash-jc-allen (Ash Allen) 我是一名来自英国普雷斯顿的自由职业Laravel网络开发者。我维护Ash Allen设计博客,并且参与了很多酷的和令人兴奋的项目 🚀

你可能还喜欢以下文章

2024年3月11日

如何使用Larastan将从0到9的过程完成您的Laravel应用

在执行之前就发现您的Laravel应用中的错误是可能的,归功于Larastan...

阅读文章
2024年7月19日

在不使用特质的情况下标准化API响应

我注意到大多数用于API响应的库都是使用特质实现的,...

阅读文章
2024年7月17日

通过Discord通知在您的Laravel项目中收集反馈

如何在Laravel项目中创建反馈模块,并在收到消息时接收Discord通知...

阅读文章

我们想对这些 惊人的公司 表示感谢,感谢他们对我们的大力支持

您的标志在这里?

Laravel.io

Laravel 门户,用于问题解决、知识分享和社区建设。

© 2024 Laravel.io - 版权所有。