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

2 ответа

Решение

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

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

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

Я знаю, что уже слишком поздно, но мне не понравилось Array#include? Решение, поэтому я пошел вперед и добавил 2 новых метода для safelist а также blocklist каждый иметь поддержку для того же. Поделиться здесь, так как это поможет и другим пользователям. Его можно найти в ветке ветки rack_attack.

Использование:

Safelisting:

# 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)

Blocklisting:

# 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)
Другие вопросы по тегам