Rails app,使用Kickstarter的rack-attack
在我的config / rack-attack.rb文件中,我有:
class Rack::Attack
Rack::Attack.blacklist ('block ip') do |req|
# Request are blocked if the return value is truthy
'68.888.23.22' == req.ip
# req.ip if IPCat.datacenter?(req.ip)
end
end
在我开始使用CloudFlare之前,此工作正常。 req.ip现在是Cloudflare IP vs实际最终用户的IP
我在尝试将用户的IP保存到我的服务器日志时遇到了类似的问题(正在保存Cloudflare IP)。为了解决这个问题,我将以下内容添加到我的应用程序控制器中:
module ActionDispatch
class Request < Rack::Request
alias :remote_ip_orig :remote_ip
def remote_ip
@remote_ip ||= (@env['HTTP_CF_CONNECTING_IP'] || remote_ip_orig)
end
end
end
在机架攻击中使用HTTP_CF_CONNECTING_IP作为req.ip是否有类似的过程?
答案 0 :(得分:4)
尝试添加:
class Rack::Attack::Request < ::Rack::Request
def cf_ip
@env['HTTP_CF_CONNECTING_IP'] ? @env['HTTP_CF_CONNECTING_IP'] : ip
end
end
然后你可以使用:
throttle('req/ip', :limit => 300, :period => 5.minutes) do |req|
req.cf_ip
end
答案 1 :(得分:0)
如果你想在 ActionPack 和 Rack :: Attack :: Request 上解决问题,你可以这样做:
module ActionPack
module Cloudflare
module Request
def remote_ip
remote_ip_cloudflare || super
end
private
def remote_ip_cloudflare
@env['HTTP_CF_CONNECTING_IP']
end
end
end
end
ActionDispatch::Request.class_eval do
prepend ActionPack::Cloudflare::Request
end
Rack::Attack::Request.class_eval do
prepend ActionPack::Cloudflare::Request
end
我希望它有所帮助。