класс ActionDispatch::RemoteIp
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.
Атрибуты
Общедоступные методы класса
# 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-адреса и возвращать нужный вам адрес.
Общедоступные методы экземпляра
# 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.