短信验证:用户phone号码变了怎么办?

SMS verification : what if user phone number changed?

我正在构建一个应用程序,我正在考虑让用户 phone 号码发送验证短信。不过,想象一下 phone 号码是否被取消并稍后归因于其他人。然后,新人将能够以旧人的名义连接到我的应用程序...... 那么有什么办法可以防止这种行为吗? 我想让它像 tinder 一样:可以通过 2 种不同的方式注册:(facebook 连接和 phone 号码)或(phone 号码和邮件)

我还有一个问题:我看到很多短信发送服务都不是免费的(实际上都是免费的)。如果我使用这些服务创建 api,任何人都可以向它发送大量 http 请求并让我支付 0.05 欧元乘以 100000000 的费用?而且我不能依赖 IP 地址,因为使用 3G 时,IP 与特定的人无关...

第一个问题:

您描述的是两步验证(又名两步验证),您可以在维基百科页面中阅读:Multi-Factor Authentication (MFA):

a method of confirming a user's claimed identity by utilizing something they know (password) and a second factor other than something they have or something they are. An example of a second step is the user repeating back something that was sent to them through an out-of-band mechanism.

您说得对,phone 号码可以更改所有者(电子邮件地址也可以,但平均时间较长)。您正在使用他们的 phone 号码作为上述带外机制。

如果用户最近使用他们的密码进行了身份验证,当您向用户发送带外代码并且他们将其重新输入输入框时,您有一定程度的信心最终用户都知道密码并有权访问 SMS 消息并选择信任该关联。

您将需要考虑在用例的安全上下文中您是否可以信任该关联以及可以信任该关联多长时间。

例如,在检测到最终用户刚刚在您以前从未见过的设备上进行身份验证时添加两步验证是一种很好的额外保护。然而,在帐户恢复中使用带外短信验证可能会打开一个大的安全漏洞。您不想通过简单地访问该 SMS 号码来绕过密码重置流程中他们知道的东西(密码)的身份验证。 SMS 也不是一种适用于一次性密码 (OTP) 的机制。

如果您想为用户的帐户提供更多保护,请考虑使用软件令牌(例如 Google Authenticator, Authy, etc.) and hard tokens (eg. FIDO U2F devices such as Yubikey, Google Titan 等)实施真正的 MFA。

关于你的第二个问题:

你是对的,基于 IP 的限制是不够的。使用 SMS 服务,您可能会在服务器端 API 调用 SMS 提供商。首先检查您的提供商具有哪些开箱即用的安全功能。接下来,保护您的端点,它触发了对 SMS 提供商的 API 调用。

  • 速率限制发送给任何给定收件人的 SMS 消息的数量(例如,每 Y 分钟发送给一个号码的 SMS 消息不超过 X 条window)

  • 速率限制一个人可以向不同号码发送的 SMS 消息的数量(例如,每个用户每天不超过 X 个不同的 phone 号码)。

  • 不允许未经身份验证的请求。在执行带外 SMS 步骤之前,用户应该已经完成​​了第一个身份验证步骤(他们知道的东西,例如 username/password)。

  • 保护 SMS 表单免受 Cross Site Forgery Requests (CSFR) 的侵害。如果您的后端知道请求来自您的前端而不是其他主机,则它只应向 SMS 提供商发出 API 调用。

  • 保护 SMS 表单免受机器人攻击。有许多方法,Google ReCaptcha 是最常见的方法之一。