如何保护你的身份验证机制
翻译
原文:https://portswigger.net/web-security/authentication/securing
- name: 翻译
desc: 原文:https://portswigger.net/web-security/authentication/securing
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 如何保护你的身份验证机制
在本节中,我们将讨论 如何防止身份验证机制中,出现我们讲解过的一些漏洞。
身份验证是一个复杂的主题,正如我们所展示的那样,不幸的是,弱点和缺陷很容易出现。在这里讲解所有的保护措施 显然是不现实的。但是,有几个一般原则,你应该始终遵循。
# 1.1小心用户凭据
如果你无意中 向攻击者泄露了一组有效的登录凭据,即使是最强大的身份验证机制,也是无效的。这一点不用说,你永远都不应该通过未加密的连接,来发送任何登录数据。尽管你已经为登录请求实现了 HTTPS,但请确保 将任何 HTTP 请求重定向到 HTTPS 来强制执行此操作。
您还应该审核您的网站,以确保 公开访问的配置文件 或 HTTP 响应中没有泄露 用户名或电子邮件地址。
# 1.2不要指望用户的安全性
严格的身份验证措施,通常需要用户进行一些额外的工作。人类的本性使得一些用户 会找到方法来节省自己的精力。因此,您需要尽可能 强制实施安全行为。
最明显的例子是:实施有效的密码策略。一些更传统的策略之所以失败,是因为人们将自己的可预测密码,硬是要输入到策略中。相反,实现某种简单的密码检查器可能更有效,它允许用户对密码进行试验,并实时提供有关其强度的反馈。一个流行的例子,是由 Dropbox 开发的 JavaScript 库 zxcvbn 。只允许密码检查器评级较高强度的密码,与传统策略相比,你可以更有效地 强制用户使用安全密码。
# 1.3防止用户名枚举
如果你泄露系统上存在的用户,则攻击者就更容易破坏你的身份验证机制。甚至在某些情况下,由于网站的性质,“知道某个人有特定的账户” 本身就是敏感信息。
无论尝试的用户名是否有效,都必须使用相同的通用错误消息,并确保它们确实相同。每个登录请求都应该返回相同的 HTTP 状态代码,最后,使不同情况下的响应时间尽可能难以区分。
# 1.4实施强大的暴力破解保护
考虑到构建暴力攻击是多么简单,确保你采取措施 防止或中断 任何暴力登录的尝试,是至关重要的。
这应该包括 “防止攻击者操纵其明显 IP 地址的防护措施” 。理想情况下,你应该要求用户 在每次登录尝试达到一定限制后,完成 CAPTCHA(验证码)测试。
请记住,这并不能保证完全消除暴力破解的威胁。但是,使该过程尽可能繁琐和手动,可能会使任何潜在攻击者放弃攻击,并寻找更容易的其它目标。
# 1.5对你的验证逻辑进行三重检查
正如我们在实验室 (opens new window)所展示的那样,简单的逻辑缺陷 (opens new window)很容易渗透到代码中,在身份验证的情况下,这些缺陷有可能完全危及你的网站和用户。彻底审查所有验证或确认逻辑 以消除缺陷,是可靠身份验证的关键。所以,“可以绕过的检查” 并不会比 “根本没有检查” 好到哪里去。
# 1.6不要忘记附加功能
确保不要只关注中心登录页面,而忽略与身份验证相关的其他功能。在攻击者可以自由注册自己的帐户,并探索此功能的情况下,这一点尤其重要。请记住,密码重置或更改功能,与主要登录机制一样是有效的攻击面,因此必须同样健壮。
# 1.7实施正确的多因素身份验证
虽然多因素身份验证 可能不适用于每个网站,但如果操作得当,它比单独的、基于密码的登录更安全。请注意,“验证同一因素的多个实例” 并不是真正的多因素身份验证。“通过电子邮件发送验证码” 本质上只是一种更冗长的单因素身份验证形式。
基于 SMS(短信)的 2FA 技术验证了两个因素(你知道的 和 你拥有的)。但是,如果存在 SIM 卡交换滥用的可能性,这意味着该系统可能并不可靠。
理想情况下,2FA 应该使用 “直接生成验证码的专用设备 或 应用程序” 来实现。由于它们是专门为提供安全性而构建的,因此它们通常更安全。
最后,就像主身份验证逻辑一样,请确保 2FA 检查中的逻辑是合理的,以便无法被轻易绕过。