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

Posted

技术标签:

【中文标题】机架攻击阻止列表不起作用【英文标题】:Rack Attack Block List Doesn't work 【发布时间】:2018-07-17 19:11:11 【问题描述】:

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

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

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

【讨论】:

谢谢。我明白你的意思了。如果我删除 flash[:error],阻止列​​表仍然会被忽略。我在那里有错误消息只是为了验证国家代码。任何线索为什么它仍然不起作用?我要编辑我的代码。 是的,你是对的,我忽略了另一个问题。请参阅我的编辑。干杯

以上是关于机架攻击阻止列表不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Payflow Pro:阻止重复发票 ID 不起作用

显示:阻止在 Chrome 或 Safari 中不起作用

在 nGinx 中检查 GeoIP 不起作用

在带有 Xamarin.iOS 的 iOS 7 上的 ViewDidAppear 方法中显示阻止的 UIAlertView 不起作用

jplayer 的 Flash 后备在 chrome 中不起作用,因为“不可见的 [Flash] 内容总是被阻止”。

快速无效计时器不起作用