1. ホーム
  2. ruby-on-rails

[解決済み] Railsのrequest.remote_ipとrequest.ipの違いは何ですか?

2023-06-27 15:47:19

質問

タイトルの通り、どちらの方法でもクライアントのipを取得することができます。何か違いがあるのでしょうかね。よろしくお願いします。

のソースコードに

"/usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.3/lib/action _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

が、その意味するところは本当にわかりません。

どのように解決するのですか?

ソースから。

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::Request は次のようになります。

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 というミドルウェアで設定されています。そのミドルウェアのソースを見ると、呼び出されるときにスプーフィング攻撃をチェックしていることがわかります。 GetIp.new を呼び出してenv変数をセットしています。そのために必要なのが remote_ip はローカルのプロキシを通しても IP アドレスを読み取るため、 Clowerweb が説明しているように、これが必要です。