Spec-Zone.ru › Ruby on Rails 8.1

класс ActionDispatch::RemoteIp

Родитель:
Object

Action Dispatch RemoteIp

Это промежуточное ПО вычисляет IP-адрес удалённого клиента, отправившего запрос. Для этого оно проверяет различные заголовки, которые могут содержать этот адрес, а затем выбирает последний установленный адрес, которого нет в списке доверенных IP-адресов. Такой подход следует примеру, заданному, например, сервером Tomcat. Более подробное описание алгоритма приведено в разделе GetIp#calculate_ip.

Некоторые серверы Rack объединяют повторяющиеся заголовки, как того требует HTTP RFC 2616. Некоторые серверы Rack просто отбрасывают предыдущие заголовки и сообщают только значение, переданное в последнем заголовке. Если вы используете несколько прокси-серверов (например, NGINX, затем HAProxy, затем Unicorn), проверьте свой сервер Rack, чтобы убедиться в корректности данных.

ЕСЛИ ВЫ НЕ ИСПОЛЬЗУЕТЕ ПРОКСИ, ВЫ УЯЗВИМЫ ДЛЯ ПОДМЕНЫ IP-АДРЕСА. Это промежуточное ПО предполагает, что поблизости находится хотя бы один прокси-сервер, который устанавливает в заголовках удалённый IP-адрес клиента. Если вы не используете прокси, например, потому что размещаетесь на Heroku без SSL, любой клиент может заявить, что у него любой IP-адрес, установив заголовок X-Forwarded-For. Если вас это беспокоит, необходимо явно удалять или игнорировать эти заголовки до запуска данного промежуточного ПО. Также можно удалить это промежуточное ПО, чтобы случайно не полагаться на него.

Константы

TRUSTED_PROXIES

Список доверенных IP-адресов по умолчанию включает только IP-адреса, которые согласно спецификации IP гарантированно являются частными. В рабочей среде они не будут конечным IP-адресом клиента, поэтому отбрасываются. Подробнее см. на странице en.wikipedia.org/wiki/Private_network.

Атрибуты

check_ip [R]
proxies [R]

Общедоступные методы класса

new (app, ip_spoofing_check = true, custom_proxies = nil) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 67
    def initialize(app, ip_spoofing_check = true, custom_proxies = nil)
      @app = app
      @check_ip = ip_spoofing_check
      @proxies = if custom_proxies.blank?
        TRUSTED_PROXIES
      elsif custom_proxies.respond_to?(:any?)
        custom_proxies
      else
        raise(ArgumentError, <<~EOM)
          Setting config.action_dispatch.trusted_proxies to a single value isn't
          supported. Please set this to an enumerable instead. For
          example, instead of:

          config.action_dispatch.trusted_proxies = IPAddr.new("10.0.0.0/8")

          Wrap the value in an Array:

          config.action_dispatch.trusted_proxies = [IPAddr.new("10.0.0.0/8")]

          Note that passing an enumerable will *replace* the default set of trusted proxies.
        EOM
      end
    end

Создаёт новый экземпляр промежуточного ПО RemoteIp.

Параметр ip_spoofing_check по умолчанию включён. Если он включён, возникает исключение, когда кажется, что клиент пытается подделать собственный IP-адрес. Имеет смысл отключить эту проверку на сайтах, предназначенных для клиентов без IP-адресов (например, устройств WAP), или за прокси-серверами, которые устанавливают заголовки некорректным или неоднозначным образом (например, AWS ELB).

Аргумент custom_proxies может принимать перечисляемый объект, который будет использоваться вместо TRUSTED_PROXIES. При любой настройке прокси нужное вам значение окажется в середине (или в начале) списка X-Forwarded-For, а следом за ним будут указаны ваши прокси-серверы. Если ваши прокси не удаляются из списка, передайте их через параметр custom_proxies. Тогда промежуточное ПО будет игнорировать эти IP-адреса и возвращать нужный вам адрес.

Общедоступные методы экземпляра

call (env) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 95
def call(env)
  req = ActionDispatch::Request.new env
  req.remote_ip = GetIp.new(req, check_ip, proxies)
  @app.call(req.env)
end

Поскольку IP-адрес может не потребоваться, мы сохраняем здесь объект, не вычисляя IP-адрес, чтобы не замедлять обработку большинства запросов. Для запросов, которым необходимо знать IP-адрес, метод GetIp#calculate_ip вычислит и сохранит IP-адрес клиента в кэше.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API