尝试谷歌搜索一个 Rails 插件,该插件将允许限制特定资源消耗的请求量。 Django 的 Piston 有一些这方面的开源代码。 Rails 是否有开箱即用的东西,或者是否可以安全地假设看看 Piston 是如何做到这一点并将其移植为 Rails 插件是可以进行的工作?
Rack::Defense 是一个用于请求限制和过滤的机架中间件。它易于设置,占用空间小,并且只有两个依赖项(rack 和 redis)。您几乎可以根据任何条件进行过滤:ip、api 令牌、用户名等。
以下是如何限制路径
/login
的 POST 请求的示例,最大速率为每个 IP 每分钟 20 个请求:
Rack::Defense.setup do |config|
config.throttle('login', 20, 60 * 1000) do |req|
req.ip if req.path == '/login' && req.post?
end
end
关于如何限制路径
/api/*
的 GET 请求的另一个示例,最大速率为每个 API 令牌每秒 50 个请求:
Rack::Defense.setup do |config|
config.throttle('api', 50, 1000) do |req|
req.env['HTTP_AUTHORIZATION'] if %r{^/api/} =~ req.path
end
end
免责声明:我是 Rack::Defense gem 维护者。
这里有一个关于为什么您可能希望在应用程序之外进行速率限制的线程。至少值得深思。我自己正在寻找这个解决方案,并且不确定是否要在应用程序层中执行此操作。
从Rails 7.2开始,您不需要像rack-attack这样的第三方工具。
可以直接使用
rate_limit
方法。
class SessionsController < ApplicationController
rate_limit to: 10, within: 3.minutes, only: :create
end
更多详细信息请参见:https://blog.saeloun.com/2024/04/01/rails-7-2-adds-rate-limiting-to-action-controller/