2

我正在尝试创建一个 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

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

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地址是否可以访问。

4

3 回答 3

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
于 2014-05-28T15:13:31.480 回答
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",而其余的则被忽略。

于 2014-05-28T15:18:43.247 回答
1

我知道为时已晚,但我不喜欢该Array#include?解决方案,因此我继续添加了 2 种新方法,safelist并且blocklist每种方法都支持相同的方法。在这里分享它,因为它也会帮助其他用户。它可以在forked rack_attack 分支中找到。

用法:

安全列表:

# 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)
于 2019-06-14T07:21:28.097 回答