机架攻击阻止列表不起作用

时间:2018-07-17 19:11:11

标签: ruby-on-rails geoip rackattack

我在导轨5中使用了宝石rack-attack和宝石geoip。一切设置都很好,但是由于某种原因,我无法使阻止列表能够阻止国家/地区代码。我设置了一个Flash警报,以确保传递了正确的国家/地区代码,它是(“ CA”)。 “ CA”也在阻止列表中,但我的应用程序并没有阻止我访问它。

我要去哪里错了?

def get_ip
    @ip = request.ip
    @country = GeoIp.geolocation("#{@ip}", :precision => :country)
    country_code = @country[:country_code]


    Rack::Attack.safelist('allow from localhost and select countries') do |req|
      '127.0.0.1' || '::1' == req.ip || 'US' == req.country_code 

    end

   Rack::Attack.blocklist('block specific countries') do |req|
      "CA" == req.country_code

    end
  end

1 个答案:

答案 0 :(得分:1)

一切都在您的安全清单上。看到这个方块了吗?

Rack::Attack.safelist('allow from localhost and select countries') do |req|
  '127.0.0.1' || '::1' == req.ip || 'US' == req.country_code 
  flash[:error] = "#{req.country_code}"
end

最后一个可执行语句是flash [:error]的赋值,它返回字符串“#{req.country_code}”,任何字符串都是“ truthy”,因此该块返回true。

更改语句的顺序,以便最后一条语句将返回正确的true / false值。

Rack::Attack.safelist('allow from localhost and select countries') do |req|
  flash[:error] = "#{req.country_code}"
  '127.0.0.1' || '::1' == req.ip || 'US' == req.country_code 
end

您的阻止列表块存在相同的问题...请确保实际测试是最后执行的语句,否则您将始终为真。

编辑

但是我只是注意到您仍然在安全清单上保留了所有内容... '127.0.0.1'是一个字符串,字符串始终是真实的,因此在...

'127.0.0.1' || ... 

由于字符串为true,其余部分永远不会得到评估。

也许您想要这个...

Rack::Attack.safelist('allow from localhost and select countries') do |req|
  flash[:error] = "#{req.country_code}"
  '127.0.0.1' == req.ip || '::1' == req.ip || 'US' == req.country_code 
end