【问题标题】:How to avoid abusing your REST API? block to many calls from same client JAX-RS (Dropwizard)如何避免滥用您的 REST API?阻止来自同一客户端 JAX-RS (Dropwizard) 的多个调用
【发布时间】:2016-05-23 20:27:15
【问题描述】:

不确定我是否正确,但假设我有一个 REST API 和端点,例如,创建一些资源,假设@POST 创建用户。

如何保护我的应用免遭用户使用 for-loop 进行 10000 次 API 调用以创建无用资源?

是否可以编写一个过滤器来阻止这种行为?我希望你明白我的意思。

【问题讨论】:

  • @KevinB 这是一个编程问题,如果您在应用级别(甚至服务器级别)考虑基于分数/定价系统
  • 看起来你想要leaky bucket filter 或类似的东西。我们使用缓存到后备驱逐地图中的授权凭据实现了类似的功能。如果在给定时间内收到来自同一个客户端的 n 次以上的请求,我们会对连续请求做出错误响应,直到缓存至少有空间容纳下一个请求。虽然为了简单起见,你也可以使用一个固定的计时器,每隔 n 分钟自动清除一次缓存

标签: rest api jax-rs fraud-prevention


【解决方案1】:

你有很多选择:

  • 当某个 ip 产生大量查询时阻止 ip
  • 屏蔽ip+useragent+用户浏览器的其他详细信息
  • 使用行为模式匹配阻止用户
  • 显而易见的选择是在电子邮件验证(注册过程)后面隐藏一些 REST 方法

假设用伪代码ABUSING_ID = md5(ip+useragent)

  • 你可以有类似定价系统的东西,所以每个 api 调用都有一个价格(0 到 10),并将每个 ABUSING_ID+他们的 api 调用价格存储在数据库中(即一天)。因此,当给定 ABUSING_ID 的请求总价格超过阈值时,您会阻止它们。 (更正式,而且我敢肯定,更好的方法是@roman-vottner 建议的Leaky bucket algorithm

您可以在不同的系统级别(客户端、负载平衡器/Web 服务器端 (fail2ban)、应用程序级别)实现此方案

您覆盖的级别越多越好。

  • 一些初学者可以使用 gui-automation 在您的 UI 内单击(如果它公开了您的 API),因此您需要客户端保护。

  • 更高级的欺诈者可以使用脚本来 curl 你的 api,你需要服务器端保护

  • 另一种使用 phantonjs 之类的东西来模拟浏览器环境(客户端保护)

  • 一些大亨足够了解雇佣廉价工人来点击您的网站/使用定制工具提出请求

  • proxy-servers/tor/botnets/browser-fingerprinting 预防(基本上,每次请求都会更改用户代理和其他详细信息)等。

如果您的 API 被大量使用,您可以从收集统计数据开始 - 稍后会有所回报。 在最坏的情况下,您需要一个由数据科学家和编码人员组成的团队来创建一个有效的、难以破解的欺诈预防系统。

全世界都在打仗 :-)

附:我没有说任何关于授权 API 调用(令牌等)的内容,因为授权 API 调用更容易捕获,我们在这里讨论的是不受保护的 REST 查询

附言还有另一个指标,但您必须将其视为最后的手段:如果您的服务是国际性的、全球级的,但您有太多来自虚构的欺诈斯坦的欺诈行为,而这种欺诈行为对您的业务造成的损害更大,那么良好的流量会给您带来更多的损失利润,您应该屏蔽整个国家并发出通知,以便该国家/地区的好客户可以通过更严格的协议进行注册。

【讨论】:

  • 也许他们知道我们不知道的事情
  • 你找到其他方法了吗?
  • @PrashantThorat 据我所知,没有其他方法可以限制 API、限制用户或限制请求。
【解决方案2】:

我同意@strangeqargo 的回答。如果你不想自己实现,有几个服务会分析请求并建议是否阻止它们,我对ShieldSquare有很好的体验

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2016-12-06
    • 2015-02-03
    • 1970-01-01
    • 2018-09-21
    • 2011-10-22
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多