サーブレットで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];
答えは複雑です。
サーブレットがリバースプロキシまたはロードバランサーの背後にあるWebサーバーで実行されている場合、そのWebプロキシは、リクエストの送信元IPアドレスを提供するリクエストヘッダーを挿入するように構成できます。異なるリバースプロキシは異なるヘッダーを挿入します。 (フロントエンド)サーバーのドキュメントを参照してください。
クライアントが(フォワード)プロキシを使用する場合、mightヘッダーを挿入して、クライアントのIPアドレスが何であるかを示します...またはそうでない場合があります。そして、挿入するIPアドレスmightが正しくありません。
request.getRemoteAddr()
を呼び出すことで取得する値は、リクエストのimmediateアップストリームソースのIPアドレスになります。
リストしたヘッダーはいずれも標準ではありませんが、「x-forwarded-for」は事実上の標準であると言われています。つまり、プロキシなどによって挿入される可能性が最も高いのは...何かが注入された場合です。
最後に、IPアドレスを取得したとしても、それは必ずしもあなたを助けません。たとえば、クライアントがプライベートネットワーク上にあり、NATゲートウェイを介してインターネットに接続している場合、HTTP要求のIPアドレスは、NATサーバー...実際のクライアントIPではありません。
では、これはどういう意味ですか?基本的に、これは一般的にできない信頼性の高い要求の発信元のシステムのIPアドレスを見つけることができないことを意味します。
これは、クライアントの元のIPアドレスを取得するためにできることのほとんどです
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}