假设我有一个iOS / Android应用程序,它依赖于自定义REST API来处理帐户管理(注册,登录,密码重置,获取/设置用户相关数据)等事项。
没有什么好方法可以保证我的API只能通过我的移动应用程序调用。 Oauth2之类的'秘密'在客户端代码中 - 可以很容易地进行逆向工程。
我们说我有这样的API调用:
https://www.myapi.com/register_user?username=UUU&password=PPP&email=EEE
(当然,并非完全相同,但你明白了)
这会创建一个新用户,然后所有API调用将包含会话令牌或将API调用与具有帐户的特定应用用户绑定的内容。
第一次注册是唯一一个没有受到任何保护的人,而我担心的是,恶意的人从PC脚本中拨打了1,000,000次来创建大量假用户,特别是用真实的电子邮件地址拥有这些地址的用户无法使用该应用。
那么如何保护第一个API调用以防止大规模滥用?我想在用户注册表中加入经过服务器验证的适合移动设备的CAPTCHA。
同样,所有后续API调用都受到会话令牌和每个用户监控的API调用计数的保护(可疑的被阻止)。
这有意义吗?我是不是太复杂了?非常感谢
PS:似乎其他有趣的选择包括使用电子邮件验证或像谷歌这样的稳固的第三方身份提供商 - 这3个选项都不是完美的。无论如何,对围绕这个问题的讨论感兴趣。答案 0 :(得分:0)
我建议当您看到注册滥用时,CAPTCHA将成为第二级保护。这里有几个不同的角度:
除非您在请求帐户时立即分配昂贵的资源,否则所有发生的事情都是正在创建一堆数据库记录。如果您要立即分配资源,则需要更改入门流程,以便用户只有在合法验证其电子邮件并登录应用程序后才能获得这些资源。您可以单独进行清理工作,以便在数据库中删除所有未在合理期限内(可能是两周?)激活的请求。
如果您可以继续处理注册API调用,则可以阻止大多数滥用行为。大多数情况下,您尝试改进正在注册的新用户数量。通过监控/警报,您可以在注册行为开始变得可疑时采取防御措施。例如:
正如我在开始时所说,CAPTCHA可以是第二级,其中第一级是注册请求具有限制功能。对于来自同一IP的每次新注册尝试,您可以指数地花费更长的时间来响应。在观察到太多尝试并且响应时间已经足够长之后,您可以开始要求CAPTCHA。
希望在这个阶段,你可以控制滥用。但是如果CAPTCHA没有给出你期望的结果,也准备开始阻止/暂时禁止API调用。
顺便说一下,这个以及大多数其他反滥用功能都将受益于能够即时配置您的服务,在观察和分析效果的同时使用不同的值/选项。