Rails ActionController: разница между request.remote_ip и request.remote_addr
В источнике ActionController локальные запросы определяются следующим образом:
def local_request? #:doc:
request.remote_addr == LOCALHOST && request.remote_ip == LOCALHOST
end
В моем приложении я хочу использовать другую логику, если запросы поступают из определенного диапазона IP. В чем разница между request.remote_addr
и request.remote_ip
, и какой из них я должен использовать?
Ответы
Ответ 1
Я являюсь автором текущей реализации remote_ip
, а другие вещи, которые он включает, включают проверку атак на IP-спуфинг и правильную обработку нескольких заголовков X-Forwarded-For
. Однако есть большой оговорка: только некоторые веб-серверы Ruby поддерживают несколько заголовков, поэтому значение все равно может быть неправильным.
Я написал результаты тестирования самых популярных серверов приложений Ruby в своем блоге, которые вы можете проверить, если вопрос о повторных заголовках для вашего приложения.
Ответ 2
Кажется, что remote_addr
возвращает значение переменной среды remote_addr
as-is, а remote_ip
будет корректировать это на основе наличия переменных HTTP_X_FORWARDED_FOR
и HTTP_CLIENT_IP
например, когда ваш клиент пересылается через прокси.
Эта двойная проверка для local_request?
- это просто способ убедиться, что пользователь пришел с локальной машины и не был просто перенаправлен из другого места через локальный прокси.