класс 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 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-адреса и вернёт нужный вам.
Публичные методы экземпляра
# 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.