Spec-Zone.ru › Ruby on Rails 4.1

класс ActionDispatch::RemoteIp

Родитель:
Объект

Этот промежуточный обработчик вычисляет IP-адрес удаленного клиента, который делает запрос. Он делает это, проверяя различные заголовки, которые могут содержать адрес, а затем выбирая последний установленный адрес, который не находится в списке доверенных IP-адресов. Это соответствует прецеденту, заданному, например, сервером Tomcat, с объяснением принципов @gingerlime. Более подробное объяснение алгоритма приведено в ActionDispatch::RemoteIp::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, check_ip_spoofing = true, custom_proxies = nil) Показать исходный код

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

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

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

# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 57
def initialize(app, check_ip_spoofing = true, custom_proxies = nil)
  @app = app
  @check_ip = check_ip_spoofing
  @proxies = case custom_proxies
    when Regexp
      custom_proxies
    when nil
      TRUSTED_PROXIES
    else
      Regexp.union(TRUSTED_PROXIES, custom_proxies)
    end
end

Публичные методы экземпляра

call(env) Показать исходный код

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

# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 74
def call(env)
  env["action_dispatch.remote_ip"] = GetIp.new(env, self)
  @app.call(env)
end

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

Spec-Zone.ru

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