Rails ActionController: разница между request.remote_ip и request.remote_addr - PullRequest
12 голосов
/ 02 ноября 2010

В источнике ActionController локальные запросы определяются следующим образом:

def local_request? #:doc:
    request.remote_addr == LOCALHOST && request.remote_ip == LOCALHOST
end

В моем приложении я хочу использовать другую логику, если запросы поступают из определенного диапазона IP-адресов. В чем разница между request.remote_addr и request.remote_ip, и какую мне следует использовать?

Ответы [ 2 ]

13 голосов
/ 18 октября 2012

Я являюсь автором текущей реализации remote_ip и других вещей, к которым она относится, включая проверку на спуфинговые IP-атаки и правильную обработку нескольких X-Forwarded-For заголовков. Однако есть большая оговорка: только некоторые веб-серверы Ruby поддерживают несколько заголовков, поэтому значение все равно может быть неправильным.

Я записал результаты тестирования самых популярных серверов приложений Ruby в своем блоге , который вы можете проверить, если повторные заголовки имеют значение для вашего приложения.

9 голосов
/ 02 ноября 2010

Похоже, что remote_addr возвращает значение переменной окружения REMOTE_ADDR как есть, в то время как remote_ip будет корректировать его на основании наличия переменных HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP, например, когда ваш клиент перенаправляется через прокси.

Эта двойная проверка для local_request? - это просто способ установить, что пользователь пришел с локальной машины, а не был просто перенаправлен откуда-то еще через локальный прокси.

...