【发布时间】:2011-08-19 07:01:25
【问题描述】:
我想实现重置密码功能,以防用户丢失密码。但我担心有人能够针对不属于他的单个或多个电子邮件地址提出大量此类请求,这对这些地址的实际所有者来说会很烦人,我最终会被列入黑名单。
我能做些什么来保护这个功能免受这种情况的影响?设置每个 ip 发送的有效电子邮件的限制? (我猜最多 3 封电子邮件就可以了)
【问题讨论】:
标签: security authentication user-interface authorization
我想实现重置密码功能,以防用户丢失密码。但我担心有人能够针对不属于他的单个或多个电子邮件地址提出大量此类请求,这对这些地址的实际所有者来说会很烦人,我最终会被列入黑名单。
我能做些什么来保护这个功能免受这种情况的影响?设置每个 ip 发送的有效电子邮件的限制? (我猜最多 3 封电子邮件就可以了)
【问题讨论】:
标签: security authentication user-interface authorization
为什么不简单地在密码重置申请表中添加验证码?然后,您可以限制每个电子邮件地址和每天/每周/每月的请求数量,但 CAPTCHA 可以让机器人远离。
【讨论】:
假设您正在编写一个打算在 Internet 上使用的应用程序,您无法控制用户的注册,您可以对用户帐户上尝试的密码重置尝试次数设置滚动限制。
滚动限制将用于确保在短时间内不会发出过多的密码重置请求。您可以限制用户发出 3 次密码重置请求,但只能在 1 小时内,甚至可能是 1 天;您的企业应该能够确定最佳值,特别是如果用户还可以通过其他方式(通过发送电子邮件或致电服务台)发出密码重置请求。
此外,您可以将生成的令牌(我假设您在每封邮件中发送密码重置令牌)与预定义的到期日期相关联,并且所有此类令牌只能使用一次。理想情况下,令牌的持续时间不应超过几个小时。除了通常的身份验证尝试之外,高度敏感的应用程序还将审核所有密码重置请求。
最后,您还可以限制来自某个 IP 的密码重置请求的数量(这是一种 DoS 预防攻击,对 DDoS 攻击不起作用)。不用说,如果尝试重置密码,则不应在此期间禁用关联的帐户。这样做将启用成功的 DoS 攻击,其中攻击者可以通过简单地针对已知的电子邮件 ID 数据库发出密码重置请求来禁用帐户。在建立限制时,您必须考虑 ISP 代理,否则您实际上可能会在此过程中伤害一些客户。
【讨论】:
我看到其他网络资产引入了一个新的密码重置系统(比 CAPTCHA 好得多),它提供某种形式的 2FA(双因素身份验证),您可以在其中远程登录到您的帐户,作为备份。用户将一次性的密码发送到他们的单元格,然后将其输入。无需处理垃圾邮件过滤器,无需重新加载验证码表单等……更容易。防止批量注册、垃圾邮件,并且通常似乎比替代解决方案更有效和用户友好。
【讨论】:
请注意 IP 的设置限制。您经常有一个 Internet 网关通过单个 IP(即公司网络)向大量用户公开。
如果您担心重置特定地址的请求数量,这更多是可用性问题而不是安全问题。我倾向于定义一个可接受的 rate 来平衡不允许过多的重置请求和不会使执行重置变得太困难(即原始电子邮件被垃圾邮件捕获,因此请求另一个)。例如,记录请求的时间,并且在 15 分钟内不允许另一个请求。
不过,实际上,我不会太担心这一点。如果您真的愿意,有无数种方法可以通过电子邮件与某人搞砸,除非利用您的重置功能有什么特别吸引人的地方,否则我只会做大多数网站所做的事情,并在需要时允许重置,并且只有在之后才真正重置密码用户收到电子邮件并对其进行操作。
【讨论】:
忘记密码页面保护:
输入无效电子邮件时显示成功消息。 当有人输入无效电子邮件时,告诉用户重置密码链接已发送到您的电子邮件(但实际上并没有代码做任何事情)。这将防止黑客试图识别系统上的有效帐户。
使用验证码。 避免恶意脚本针对大量电子邮件触发许多重置密码请求。
每小时发送特定电子邮件的密码链接不应超过 3 次(左右)。这将防止数据库表中存储的太多重置链接淹没数据库并填满数据磁盘。
【讨论】: