我尝试创建一个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地址是否有访问权限。
答案 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?
解决方案,因此我继续为safelist
和blocklist
添加了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)