В чем разница между запросом.удаленный ip и запрос.ip в рельсах?
как следует из названия, вы можете получить ip клиента с помощью обоих методов. Интересно, есть ли какие-то различия. Спасибо.
в исходном коде идет
"/usr/местные/РВМ/драгоценные камни/рубин-1.9.3-p194/драгоценные камни/actionpack-3.2.3/Либ/действий _dispatch / http / request.rb " 257L, 8741C
def ip
@ip ||= super
end
# Originating IP address, usually set by the RemoteIp middleware.
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
но я действительно не знаю последствий.
3 ответа:
из источника:
module ActionDispatch class Request < Rack::Request # ... def ip @ip ||= super end def remote_ip @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s end # ... end end
где Rack:: запрос выглядит так
module Rack class Request def ip remote_addrs = split_ip_addresses(@env['REMOTE_ADDR']) remote_addrs = reject_trusted_ip_addresses(remote_addrs) return remote_addrs.first if remote_addrs.any? forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR']) if client_ip = @env['HTTP_CLIENT_IP'] # If forwarded_ips doesn't include the client_ip, it might be an # ip spoofing attempt, so we ignore HTTP_CLIENT_IP return client_ip if forwarded_ips.include?(client_ip) end return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"] end end end
так
remote_ip
отдает предпочтениеaction_dispatch.remote_ip
. Это устанавливается с помощьюActionDispatch::RemoteIp
middleware. Вы можете видеть в источнике этого промежуточного программного обеспечения, что он проверяет атаки спуфинга при вызове, так как он вызываетGetIp.new
чтобы установить эту переменную env. Это необходимо, так какremote_ip
читает ip-адрес даже через локальные прокси, как объясняет Clowerweb.
request.ip
возвращает клиентуip
даже если этот клиент является прокси.
request.remote_ip
умнее и получает реальный клиентip
. Это можно сделать только в том случае, если все прокси по пути устанавливают X-Forwarded-For.
запрос.ip
request.ip
- Это основное обнаружение ip, предоставляемоеRack::Request
из коробки. Его текущее определение можно найти по адресу https://github.com/rack/rack/blob/master/lib/rack/request.rb.алгоритм, который следует, чтобы сначала проверить
REMOTE_ADDR
заголовок для любых ненадежных IP-адресов, и если он находит какие - либо, он выбирает первый один в списке. "Доверенные" IP-адреса в этом случае являются IP-адресами из зарезервированные диапазоны частных подсетей, но обратите внимание, что он соответствует регулярному выражению, что, вероятно, не лучший способ сделать это. Если нет недоверенныхREMOTE_ADDR
затем он смотрит наHTTP_X_FORWARDED_FOR
заголовок, и выбирает последние недоверенный один в списке. Если ни один из них не раскрывает никого, он возвращается к rawREMOTE_ADDR
вероятно 127.0.0.1.запрос.remote_ip
request.remote_ip
увеличено обнаружение IP обеспеченноеActionDispatch::Request
(который наследует отRack::Request
). Это код, показанный в вопросе. Как вы можете видеть, он возвращается кrequest.ip
еслиaction_dispatch.remote_ip
на@env
. Это делается с помощьюRemoteIp
промежуточное программное обеспечение, которое включено в стек Rails по умолчанию. Вы можете увидеть его источник по адресу https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/middleware/remote_ip.rb.The
RemoteIp
middleware если включено предоставляет эти дополнительные особенности:
- обеспечивает необязательное, но по умолчанию обнаружение IP-спуфинга.
- позволяет фильтровать прокси-адреса конфигурации, а не полагаться только на значения по умолчанию.
- использует
IPAddr
класс для проверки правильности диапазонов IP вместо того, чтобы полагаться на хрупкое регулярное выражение.- использует
HTTP_CLIENT_IP
как источник потенциальных IPs.алгоритм похож на
request.ip
но немного другой. Он используетHTTP_X_FORWARDED_FOR
из последних во-первых, тогдаHTTP_CLIENT_IP
от последнего до первого, а затем, наконец, последняя записьREMOTE_ADDR
. Он помещает их все в список и фильтрует прокси,выбирая первый оставшийся.обнаружение IP-спуфинга
обнаружение IP-спуфинга, предоставленное
RemoteIp
не особенно мощный, все это вызывает исключение, если последнийHTTP_CLIENT_IP
неHTTP_X_FORWARDED_FOR
. Это не обязательно симптом атаки, но это, вероятно, симптом неправильной конфигурации или смеси прокси используют различные соглашения, которые не дают согласованного результата.чтобы использовать
в простой настройке, где все ваши прокси являются локальными или в частных подсетях, вы, вероятно, можете уйти с
request.ip
, аrequest.remote_ip
должно быть рассмотрено главным выбором вообще. Если вы используете прокси с общедоступной интернет-маршрутизацией (например, многие CDNs), тоRemoteIp
можно настроить, чтобы дать вам правильный IP-адрес клиента из коробки, в то время какrequest.ip
будет исправьте, если вы можете получить свой восходящий прокси для установкиREMOTE_ADDR
правильно.Безопасная Конфигурация
теперь обратимся к комментарию Тима Коултера о спуфинге. Он определенно прав, вы должны быть обеспокоены, но он ошибается, что вас можно обмануть, если вы по умолчанию стоите за nginx или haproxy.
RemoteIp
предназначен для предотвращения спуфинга выбрав последние IP в сети. Элемент X-Forwarded-For spec указывает, что каждый прокси-сервер добавляет IP-адрес инициатора запроса до конца цепочки. При фильтрации прокси-серверов из белого списка последняя запись гарантированно будет IP-адресом клиента, записанным вашим первым прокси-сервером из белого списка. Конечно, есть одно предостережение, которое заключается в том, что вы должны на самом деле запускать прокси-сервер, который всегда устанавливает/добавляетX-Forwarded-For
, поэтому совет Тима на самом деле должен быть противоположным: используйте толькоrequest.remote_ip
когда вы are запуск прокси-сервера.как настроить для публичных IP Прокси
это все нормально и хорошо, но
ActionDispatch::RemoteIp
уже находится в стеке промежуточного программного обеспечения по умолчанию. Как перенастроить его, чтобы добавить мои прокси CIDRs?!добавьте это в ваш
application.rb
:check_spoofing = true proxies = ["23.235.32.0/20", "203.57.145.0/24"] proxies += ActionDispatch::RemoteIp::TRUSTED_PROXIES config.middleware.swap ActionDispatch::RemoteIp, ActionDispatch::RemoteIp, true, proxies