Spec-Zone.ru › Ruby on Rails 7.2

класс ActionDispatch::RemoteIp

Родитель:
Object

Action Dispatch RemoteIp

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

Некоторые Rack-серверы конкатенируют повторяющиеся заголовки, как того требует HTTP RFC 2616. Некоторые Rack-серверы просто отбрасывают предыдущие заголовки и сообщают только значение, которое было [указано в последнем заголовке](andre.arko.net/2011/12/26/repeated-headers-and-ruby-web-server). Если вы находитесь за несколькими прокси-серверами (например, 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 65
    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 93
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