对于你的第一个问题:
您正在描述您可以在 Wikipedia 页面中阅读的两步验证(又名两步验证): Multi-Factor Authentication (MFA):
一种通过利用他们知道的东西(密码)和除了他们拥有的东西或他们是的东西之外的第二个因素来确认用户声称的身份的方法。第二步的一个示例是用户重复通过带外机制发送给他们的内容。
您是正确的,电话号码可以更改所有者(就像电子邮件地址一样,但平均而言,在更长的时间段内)。您正在使用他们的电话号码作为上述带外机制。
如果用户最近使用他们的密码进行了身份验证,当您向用户发送带外代码并且他们将其重新输入到输入框中时,您有一定程度的信心,最终用户既知道密码又可以访问SMS 消息并选择信任该关联。
您将需要考虑在用例的安全上下文中是否可以信任该关联以及信任多长时间。
例如,在检测到最终用户刚刚在您从未见过的设备上进行身份验证时添加两步验证是一个很好的附加保护。但是,在帐户恢复中使用带外 SMS 验证可能会带来很大的安全漏洞。您不想通过简单地访问该 SMS 号码来绕过密码重置流程中他们知道的内容(密码)的身份验证。SMS 也不是一次性密码 (OTP) 的合适机制。
如果您想为您的用户提供更多帐户保护,请考虑使用软件令牌(例如Google Authenticator、Authy等)和硬令牌(例如Yubikey、Google Titan等FIDO U2F设备)实现真正的 MFA .
对于你的第二个问题:
你是对的,基于IP的限制是不够的。使用 SMS 服务,您可能会向 SMS 提供者发出服务器端 API 调用。首先检查您的提供商有哪些开箱即用的安全功能。接下来,保护触发对 SMS 提供程序的 API 调用的端点。
速率限制发送给任何一个给定收件人的 SMS 消息数量(例如,每 Y 分钟窗口内发送给单个号码的 SMS 消息不超过 X 条)
速率限制一个人可以向不同号码发送的 SMS 消息的数量(例如,每位用户每天不超过 X 个不同的电话号码)。
不允许未经身份验证的请求。在执行带外 SMS 步骤之前,用户应该已经完成了第一个身份验证步骤(他们知道的东西,例如用户名/密码)。
保护 SMS 表单免受跨站伪造请求 (CSFR)的影响。如果后端知道请求来自您的前端而不是其他主机,则您的后端应该只向 SMS 提供者发出 API 调用。
保护 SMS 表单免受机器人攻击。Google ReCaptcha有很多方法是最常见的方法之一。