Spec-Zone.ru › Ruby on Rails 5.0

класс 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, ip_spoofing_check = true, custom_proxies = nil) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 60
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
    Array(custom_proxies) + TRUSTED_PROXIES
  end
end

Создать новый RemoteIp экземпляр миддлваря.

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

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

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

call(env) Показать исходный код
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 76
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-адрес, метод ActionDispatch::RemoteIp::GetIp#calculate_ip вычислит кэшированный IP-адрес клиента.

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

Spec-Zone.ru

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