【发布时间】:2012-08-21 14:28:54
【问题描述】:
有没有办法实现 IP 过滤或 IP 访问规则,就像我使用 nginx/apache 来限制或阻止 Heroku 上的某些 IP?
注意:我知道这可以很容易地在我的应用程序(Rails 3.2)中完成,但我认为这不是在 Heroku 上最有效地使用我的资源。此外,基于 Rack 的解决方案比在 Rails 中实现过滤要好。
【问题讨论】:
标签: ruby-on-rails security heroku ip rack
有没有办法实现 IP 过滤或 IP 访问规则,就像我使用 nginx/apache 来限制或阻止 Heroku 上的某些 IP?
注意:我知道这可以很容易地在我的应用程序(Rails 3.2)中完成,但我认为这不是在 Heroku 上最有效地使用我的资源。此外,基于 Rack 的解决方案比在 Rails 中实现过滤要好。
【问题讨论】:
标签: ruby-on-rails security heroku ip rack
您应该查看rack-attack。看起来它和 rack-block 一样,但使用更广泛,更新也更频繁。要阻止特定 IP,您可以这样做:
# Block requests from 1.2.3.4
Rack::Attack.blacklist('block 1.2.3.4') do |req|
# Requests are blocked if the return value is truthy
'1.2.3.4' == req.ip
end
【讨论】:
Rack::Attack.blacklist 的块返回true 的值。你可以这样做:(0..255).map{ |val| '1.2.3.' + val.to_s }.include?(req.ip)
starts_with?('1.2.3') 那里更好 - 构建一个由 256 个字符串组成的数组,然后检查是否ip 是其中之一,计算量可能不是很大,但如果没有必要,您可能不想对每个请求都执行此操作。
我添加了'rack-block' 作为 Rack 中间件。在 config/initializers 中,添加一个新文件:
YourApp::Application.configure do
config.middleware.insert_before(Rack::Lock, Rack::Block) do
# Add your rules with the rack-block syntax in here
end
end
像魅力一样工作。
【讨论】:
rack-attack 有一个白名单功能 - github.com/kickstarter/rack-attack