web-dev-qa-db-ja.com

Railsのrequest.remote_ipとrequest.ipの違いは何ですか?

タイトルにあるように、両方の方法でクライアントの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

しかし、私は本当にその意味を知りません。

64
Minqi Pan

ソースから:

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

38
shime

request.ipは、クライアントがプロキシであっても、クライアントipを返します。

request.remote_ipはより賢く、実際のクライアントipを取得します。これは、途中のすべてのプロキシが X-Forwarded-For ヘッダーを設定した場合にのみ実行できます。

75
Clowerweb