机架攻击:IP地址数组

时间:2014-05-28 14:56:59

标签: ruby-on-rails rackattack

我尝试创建一个IP地址数组,以便在运行应用程序时,Rack-Attack可以从允许访问应用程序的IP地址集中进行识别。所以我所做的就是如下:

  a = "127.0.0.1"
  Rack::Attack.blacklist('allow from localhost') do |req|
    p "#{'127.0.0.1' == req.ip} "
   a != req.ip 
  end

上面的工作,所以localhost可以访问该应用程序,但我已经尝试了下面的内容似乎无法正常工作:

a = "127.0.0.1", "1.2.3.4"
  Rack::Attack.blacklist('allow from localhost') do |req|
    a.select{|x| x != req.ip}.join("")
  end

有人可以解释一下这样做的正确方法。你可以看到我创建了一个数组。我希望Rack::Attack检测数组中的IP地址是否有访问权限。

3 个答案:

答案 0 :(得分:1)

首先,如果您更明确地创建数组并编写

,那将是很好的
a = ["127.0.0.1", "1.2.3.4"]

但使用Set

更好
allowed = Set.new['127.0.0.1', '1.2.3.4']

(同样使用单引号可以节省时间,因为Ruby将此类字符串视为文字,而不是双引号)

要检查元素是否是数组的成员,您应该使用Array#include?,因此代码变为

Rack::Attack.blacklist('allow from localhost') do |req|
  !a.include? req.ip
end

答案 1 :(得分:1)

执行此操作的有效方法是使用Set,一个类似于数组的容器,但可以快速查找单个独特元素。

所以,记住这一点重写:

allowed = %w[ 127.0.0.1 1.2.3.4 ].to_set

Rack::Attack.blacklist('allow from localhost') do |req|
  !allowed.include?(req.ip)
end

在原始声明中:

a = "x", "y"

在这种情况下,a被分配给该列表中的第一件事"x",其余部分将被忽略。

答案 2 :(得分:0)

我知道为时已晚,但是我不喜欢Array#include?解决方案,因此我继续为safelistblocklist添加了2种新方法以支持它们。在此处共享它会帮助其他用户。可以在forked rack_attack branch中找到。

用法:

安全列表:

# config/initializers/rack_attack.rb (for rails app)

ALLOWED_IPS = %w[127.0.0.1 ::1 5.6.7.8 123.456.789.0/24]

Rack::Attack.safelist_ips(ALLOWED_IPS)

黑名单:

# config/initializers/rack_attack.rb (for rails apps)

BLOCKED_IPS = %w[1.2.3.4 123.456.789.0/24]

Rack::Attack.blocklist_ips(BLOCKED_IPS)