7

Rails 应用,使用 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 与实际最终用户的 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 是否有类似的过程?

4

2 回答 2

5

尝试添加:

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
于 2015-04-15T14:25:37.203 回答
0

如果你想同时解决ActionPackRack::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

我希望它有帮助。

于 2018-02-06T16:08:33.030 回答