класс 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.
Атрибуты
Публичные методы класса
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 60
def initialize(app, check_ip_spoofing = true, custom_proxies = nil)
@app = app
@check_ip = check_ip_spoofing
@proxies = if custom_proxies.blank?
TRUSTED_PROXIES
elsif custom_proxies.respond_to?(:any?)
custom_proxies
else
Array(custom_proxies) + TRUSTED_PROXIES
end
end Создать новый RemoteIp экземпляр промежуточного обработчика.
Опция check_ip_spoofing включена по умолчанию. При включении, если кажется, что клиент пытается скрыть свой IP-адрес, генерируется исключение. Логично выключить эту проверку на сайтах, ориентированных на не-IP-клиентов (например, WAP-устройства) или за прокси, которые устанавливают заголовки некорректно или запутанно (например, AWS ELB).
Аргумент custom_proxies может принимать массив строковых, IPAddr или Regexp объектов, которые будут использоваться вместо TRUSTED_PROXIES. Если предоставлен один строковый, IPAddr или Regexp объект, он будет использован дополнительно к TRUSTED_PROXIES. Любое настройка прокси поместит желаемое значение в середину (или в начало) списка X-Forwarded-For, с вашими прокси-серверами после него. Если ваши прокси не удалены, передайте их через параметр custom_proxies. Таким образом, промежуточный обработчик проигнорирует эти IP-адреса и вернёт тот, который вам нужен.
Публичные методы экземпляра
# File actionpack/lib/action_dispatch/middleware/remote_ip.rb, line 76 def call(env) env["action_dispatch.remote_ip"] = GetIp.new(env, self) @app.call(env) end
Так как IP-адрес может и не потребоваться, мы сохраняем объект здесь без вычисления IP, чтобы не замедлить большинство запросов. Для запросов, которым нужен IP-адрес, метод ActionDispatch::RemoteIp::GetIp#calculate_ip рассчитает кэшированный IP-адрес клиента.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.