web-dev-qa-db-ja.com

リクエストIPを取得する正しい方法は何ですか

サーブレットでIPを取得するいくつかの異なる方法を見つけました。しかし、私はどちらが正しいのか、なぜだかわかりません。

1:

request.getHeader( "X-Real-IP" )

2:

  String ip = request.getHeader("X-Forwarded-For"); 
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
    } `

3:

 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];
24
sprite

答えは複雑です。

  • サーブレットがリバースプロキシまたはロードバランサーの背後にあるWebサーバーで実行されている場合、そのWebプロキシは、リクエストの送信元IPアドレスを提供するリクエストヘッダーを挿入するように構成できます。異なるリバースプロキシは異なるヘッダーを挿入します。 (フロントエンド)サーバーのドキュメントを参照してください。

  • クライアントが(フォワード)プロキシを使用する場合、mightヘッダーを挿入して、クライアントのIPアドレスが何であるかを示します...またはそうでない場合があります。そして、挿入するIPアドレスmightが正しくありません。

  • request.getRemoteAddr()を呼び出すことで取得する値は、リクエストのimmediateアップストリームソースのIPアドレスになります。

リストしたヘッダーはいずれも標準ではありませんが、「x-forwarded-for」は事実上の標準であると言われています。つまり、プロキシなどによって挿入される可能性が最も高いのは...何かが注入された場合です。

最後に、IPアドレスを取得したとしても、それは必ずしもあなたを助けません。たとえば、クライアントがプライベートネットワーク上にあり、NATゲートウェイを介してインターネットに接続している場合、HTTP要求のIPアドレスは、NATサーバー...実際のクライアントIPではありません。


では、これはどういう意味ですか?基本的に、これは一般的にできない信頼性の高い要求の発信元のシステムのIPアドレスを見つけることができないことを意味します。

53
Stephen C

これは、クライアントの元のIPアドレスを取得するためにできることのほとんどです

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}
15
Burak Keceli