不确定我是否正确,但假设我有一个REST API和端点,例如,创建一些资源,比如@POST
来创建User。
如何保护我的应用程序不受那些使用10000个API调用来创建无用资源的for-loop用户的影响?
有可能编写一个过滤器来阻止这种行为吗?我希望你明白我的意思。
您有很多选择:
- 当某个ip生成大量查询时阻止ip
- 阻止ip+useragent+有关用户浏览器的其他详细信息
- 使用行为模式匹配阻止用户
- 显而易见的选择是在电子邮件验证(注册过程)后面隐藏一些REST方法
假设在伪代码ABUSING_ID = md5(ip+useragent)
中
- 你可以有类似定价系统的东西,所以每个api调用都有一个价格(0到10),并将每个ABUSING_ID+他们的api调用价格存储在数据库中(即一天)。因此,当给定ABUSING_ID的请求的总价格超过阈值时,您会阻止它们。(更正式,我相信,更好的方法是@roman vottner提出的Leaky bucket算法)
您可以在不同的系统级别(客户端、负载均衡器/web服务器端(fail2ban)、应用程序级别)实现此方案
你覆盖的级别越多越好。
-
一些初学者可以使用gui自动点击UI(如果它暴露了API),因此您需要客户端保护。
-
更高级的欺诈者可以使用脚本来卷曲你的api,你需要服务器端保护
-
另一种使用类似phantonjs的东西来模拟浏览器环境(客户端保护)
-
一些大亨知道如何雇佣廉价工人点击你的网站/使用定制工具提出请求
-
代理服务器/tor/botnets/浏览器指纹识别预防(基本上,每次请求都会更改用户代理和其他细节)等
如果您的API使用量很大,您可以从统计数据收集开始,稍后会得到回报。在最坏的情况下,你需要一个由数据科学家和编码人员组成的团队来创建一个有效的、难以破解的欺诈预防系统。
全世界都在战争中:-)
附言:我没有谈到授权的API调用(令牌等),因为授权的API调用更容易捕获,我们在这里讨论的是无保护的REST查询
附言:还有另一个衡量标准,但你必须把它视为最后的手段:如果你的服务是国际性的、全球性的,但你有太多来自虚构的Fraudistan的欺诈行为,而这种欺诈行为对你的业务的伤害大于好的流量带来的利润,你应该封锁整个国家并发出通知,这样来自该国的好客户就可以通过更严格的协议注册。
我同意@strangeqargo的回答。如果你不想自己实现这一点,有几个服务可以分析请求并建议是否阻止它们,我对ShieldSquare 有很好的体验