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)