我正在实施一个注册系统,它使用 SMS 来验证用户。当我为每条发送的短信付费时,我想防止有人向我的服务器发送 100000 条请求,这会导致向随机用户发送 100000 条短信。我想例如只接受 10 条短信/小时/用户。但是,问题是我无法真正识别具有 IP 地址的用户(可能有几个用户使用相同的 IP)。
我听说 Devicecheck 是一个 Apple API,它可以在服务器端告诉我客户端发送的临时令牌是否是真实的,来自真实的 iPhone。问题是我无法存储此令牌发送的短信数量,因为它是临时的。我唯一能做的就是在 Apple 服务器上存储 2 位,但是,使用 2 位,我无法存储用户在一小时内发送 SMS 的次数。
如果用户发送短信,我能做的最好的事情是存储一个“真”,然后如果他们再次尝试发送短信,如果我在 1 分钟内看到一个真(因为我们也可以知道上次设置这些位的时间),我可以说不。但这不是我真正想要的:如果用户输错电话号码 3 次甚至 4 次,我不想让他们等待。
您是否知道使用 DeviceCheck 存储此类信息(n sms/h/user)?
另外,我在想 swift 应用程序已经编译,所以用户看不到它的源代码。因此,我可以这样做以确保用户是真实的:
- 客户端请求服务器的密钥
- 服务器返回一个随机密钥给客户端
- 客户端以秘密方式加密此密钥,由于源代码不可读,任何人都无法看到
- 客户端发送实际请求 + 它生成的令牌 + 服务器发送的密钥
- 从密钥中,服务器对令牌进行解密,如果令牌与发送的密钥不匹配,则失败
你认为这样的过程可靠吗?