【问题标题】:Rate limiting REST requests on HerokuHeroku 上的速率限制 REST 请求
【发布时间】:2011-06-21 22:09:11
【问题描述】:

为了避免滥用,我想在我们的 Rails 应用程序中为 REST API 添加速率限制。在对此进行了一些研究之后,看起来最好的做法是move this responsibility into the web server,而不是在应用程序本身中检查这个。不幸的是,这在我的情况下无法完成,因为我将应用程序托管在 Heroku 上,因此无法控制 Web 服务器的设置。

在这种情况下应该怎么做才能停止滥用 API?

【问题讨论】:

  • 嗯,你可以一起破解一个解决方案(虽然它会很丑),这取决于你的反应有多大。例如,如果您的响应很小(您想要限制的响应小于 1 MB),您可以设置一个计时器,根据您正在执行的操作,限制/延迟来自给定会话的重复请求。相反,如果您的回复很大,这只会隔开回复(而不是减慢传输速度)。
  • @normalocity 嗯,我很喜欢这个主意!我认为在易受攻击的控制器上使用简单的 before_filter 不会那么难看。添加更复杂的规则可能会变得更复杂(例如,每个用户每分钟 10 个请求)。
  • 嗯-也许我会提交它作为答案。 :) 也许在用户帐户中添加一个字段,记录他们上次提出请求时的记录。棘手的是,如果您使用的是 Mongrel(或其他单线程 Web 服务器),如果您只是延迟请求,您将减慢其他所有人的速度。我想这就是我说的丑陋的意思。如果您使用的是不同的网络服务器,那么这种方法可能会奏效。
  • 您向 Heroku 员工寻求帮助了吗?帮助您解决此问题符合他们的利益,因为滥用会对他们的平台产生负面影响。我发现它们很有帮助。
  • 滥用单个应用程序,如问题中所述,单个应用程序可能被归类为滥用,不会对 Heroku 平台产生负面影响,因为 Heroku 平台(似乎)具有无限可扩展性和Heroku 实行公用事业定价。

标签: ruby-on-rails rest heroku rate-limiting


【解决方案1】:

我认为您正在寻找的是 rack-throttlerack-attack gem。它们都允许限制,rack-attack gem 还允许您将人们超时一段时间并阻止某些 IP 地址,如果他们是多次违规者或出于任何其他原因您想要阻止请求者。

【讨论】:

    【解决方案2】:

    考虑在客户端上放置一个 cookie,或者更好的是,在用户帐户上放置一个字段,记录他们最后一次发出请求的时间(许多身份验证插件已经这样做了),如果是最近的请求,则简单地拒绝/延迟他们的请求比说,5 秒前(20 个请求/秒)。

    注意:如果使用单线程 Web 服务器(例如 Mongrel)设置显式延迟而不是拒绝可能会延迟该 Mongrel 上的其他待处理请求。换句话说,它将影响您的其他用户。如果合适的话,也许是一个小的 javascript/ajax 响应来通知用户他们受到速率限制。想想 StackOverflow 如何阻止您在网站上过于频繁地做某些事情。

    【讨论】:

    • 最后在“用户”帐户中放置了一个字段(在这种情况下不直接翻译)与最后一次请求的时间。 (顺便说一句:由于隐私是这个应用程序的一个问题,我们使用 Redis 来存储这些信息,并在短时间内使用 EXPIRE 密钥。)
    • 这个答案是危险和错误的。 “在客户端上放置一个 cookie”实际上并没有对攻击者/滥用者进行速率限制。将时间戳放在用户对象上:a) 可以防止用户连续发出两个合法请求(减慢您的应用程序的速度)和 b) 不会对最重要的 API 端点进行速率限制:身份验证。如果您不对未经身份验证的请求进行速率限制,那么任何可以编写脚本的人都可以轻松地暴力破解您的用户密码。您希望通过 IP 地址进行速率限制,对身份验证端点进行更严格的限制。
    • @fletom - 你是对的(现在回顾 3 年前)。这是一个更好的解决方案。如果你想写一个答案,我很乐意删除我的答案并投票给你。
    • 这并不能真正回答问题。
    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2018-07-18
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多