0

我正在使用 gemrack-attack以及geoiprails 5 中的 gem。一切都设置好了,但由于某种原因,我无法让阻止列表来阻止国家代码。我已经设置了一个闪光警报,以确保正在传递正确的国家代码,并且它是(“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
4

1 回答 1

2

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

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。

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

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' || ... 

其余的永远不会被评估,因为字符串是真的。

也许你想要这个...

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
于 2018-07-17T21:55:50.620 回答