为了避免滥用,我想在我们的 Rails 应用程序中为 REST API 添加速率限制。在对此做了一些研究之后,看起来最好的做法是将这个责任转移到 Web 服务器中,而不是在应用程序本身中检查这个。不幸的是,这在我的情况下无法完成,因为我将应用程序托管在Heroku上,因此无法控制 Web 服务器的设置。
在这种情况下应该怎么做才能停止滥用 API?
为了避免滥用,我想在我们的 Rails 应用程序中为 REST API 添加速率限制。在对此做了一些研究之后,看起来最好的做法是将这个责任转移到 Web 服务器中,而不是在应用程序本身中检查这个。不幸的是,这在我的情况下无法完成,因为我将应用程序托管在Heroku上,因此无法控制 Web 服务器的设置。
在这种情况下应该怎么做才能停止滥用 API?
我认为您正在寻找的是rack-throttle
或rack-attack
宝石。它们都允许限制,rack-attack
gem 还允许您将人们超时一段时间并阻止某些 IP 地址,如果他们是多次违规者或出于任何其他原因您想要阻止请求者。
考虑在客户端上放置一个 cookie,或者更好的是,用户帐户上的一个字段,记录他们最后一次发出请求的时间(许多身份验证插件已经这样做了),并且如果它比最近的请求简单地拒绝/延迟他们的请求,比如说, 5 秒前(20 个请求/秒)。
注意:如果使用单线程 Web 服务器(例如 Mongrel),设置显式延迟而不是拒绝可能会延迟该 Mongrel 上的其他待处理请求。换句话说,它将影响您的其他用户。如果合适的话,也许是一个小的 javascript/ajax 响应来通知用户他们受到速率限制。想想 StackOverflow 如何阻止您在网站上过于频繁地做某些事情。