Rack-Attack: Массив IP-адресов

Я пытаюсь создать массив 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-адрес в массиве доступ или нет.


person user532339    schedule 28.05.2014    source источник


Ответы (3)


Эффективным способом сделать это было бы использование 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", а остальное игнорируется.

person tadman    schedule 28.05.2014
comment
Ваше упоминание to_set вызвало один из ключевых моментов, о котором парень упомянул в видео на конференции rails 2014: youtube.com/ но он это делает BANNED_IPS = Set.new['1.2.3.4', '5.6.7.8'] Но спасибо - person user532339; 28.05.2014
comment
Set.new([...]) и [...].to_set — два способа получить один и тот же результат. - person tadman; 28.05.2014

Во-первых, было бы неплохо, если бы вы более подробно описали создание массива и написали

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
person Mike Szyndel    schedule 28.05.2014
comment
До вашего ответа я пробовал это на мгновение назад. Я следил за github.com/kickstarter/rack-attack#blacklists. Однако это указывает только один конкретный IP-адрес. Я хочу указать массив IP-адресов. Спасибо за подтверждение вопроса. - person user532339; 28.05.2014

Я знаю, что уже слишком поздно, но мне не понравилось решение Array#include?, поэтому я пошел дальше и добавил 2 новых метода для safelist и blocklist, каждый из которых поддерживает одно и то же. Поделитесь им здесь, так как это поможет и другим пользователям. Его можно найти в разветвленной ветвиack_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)
person Md. Farhan Memon    schedule 14.06.2019