我最近开始设计我自己的Web-API,我目前的目标是可以用他的电话号码注册访客用户,但有一个要求:我的数据库不能包含重复的电话号码。所以我决定我需要一个服务来验证这个案例。这就是我感到有点困惑的地方。
假设我有一个REST服务,它检查系统中是否存在输入的电话号码
它消耗电话号码(如+7-913-XXX-XX-XX
(,并根据数据库中电话号码的存在/不存在产生布尔值。
如果我实现了这个逻辑,那就太天真了,所以我可以向这个服务发送尽可能多的请求,并找出与这个系统相关的真实数字。总之,数据总有一天会被泄露。
阻止特定IP地址的方式(由于一台机器的RPS很高(显然似乎不是最好的解决方案,因为有方法可以通过不同的IP。
我的问题如下:
- 我是否错过了目标中的任何概念(错误的方向或smth(?如果需要在数据库中检查,我应该如何在中以另一种方式检查电话号码
- 如果可以的话,是否有可能避免这种暴力行为,从而确保我的数据(不仅是电话号码,还有任何个人数据(的安全
- 如果没有,有没有什么通用的方法可以让暴力变得不那么容易?(以上方式除外(
- Java开发人员如何处理它?
Spring
-框架在这种情况下有帮助吗
如果您有一个无限制的端点,它告诉您是否注册了一个数字,那么没有办法完全解决这个问题。我建议你倒带一点,看看为什么你需要这个精确的功能。
将其与防止密码重置用于电子邮件地址枚举进行比较;右";方法是用";如果这个地址被注册,你将收到一个重置通知";,这不会泄露任何信息。你可以用短信做类似的事情,让他们进入下一阶段。
虽然您可以单独通过IP进行节流,但通过身份验证的用户进行节流要容易得多,因此,如果可以的话,请确保只有授权的客户端才能发出此请求。
Synchro的回答帮助我针对自己的情况提出了以下方案(对我来说,在用户注册过程中使用暴力似乎足够公平(:
- 客人进入"注册按钮">
- 客人输入电话号码
- 验证码发送到此号码(无论数据库中是否存在(
- 客人通过手机输入验证码。
- 如果验证码错误->误差
- 如果出现N次错误->错误,没有继续处理的权限("超出限制。请重试"或smth(
- 如果验证码正常,则用户会收到适当的令牌,系统可能会创建一些数据来将此会话标识为唯一的
- 现在我们有了一些权限,可以查看是否存在已验证的电话号码
- 如果它存在,提供一些"下一步该做什么"-选项(例如恢复密码(
- 如果没有,请提供空白以填写个人数据并注册用户
我知道我错过了很多步骤和验证内容,但我明白了关键概念:验证应该首先完成,只有在之后,我们才允许以某种方式在系统中检查这款手机。