我在导轨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
答案 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