web-dev-qa-db-ja.com

ノード内のユーザーのIPアドレスを確認する方法

コントローラ内から特定の要求のIPアドレスを確認する方法を教えてください。例えば(急行で):

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})
285
Shamoon

requestオブジェクトにはconnectionという名前のプロパティがあります。これはnet.Socketオブジェクトです。 net.SocketオブジェクトはプロパティremoteAddressを持っているので、この呼び出しでIPを取得できるはずです。

request.connection.remoteAddress

http および net の資料を参照してください。

_編集_

@juandがコメントで指摘しているように、サーバーがプロキシの背後にある場合、リモートIPを取得する正しい方法はrequest.headers['x-forwarded-for']です。

381
topek
var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

req.headers['x-forwarded-for']に複数のIPアドレスを取得できる場合があることに注意してください。また、x-forwarded-forヘッダーが常に設定されるとは限らず、エラーが発生する可能性があります。

フィールドの一般形式は次のとおりです。

x-forwarded-for: client, proxy1, proxy2, proxy3

ここで、値はIPアドレスのコンマとスペースで区切られたリストです。左端が元のクライアント、そして要求を受けたIPアドレスを追加して要求を渡した各連続プロキシこの例では、要求はproxy1proxy2、そしてproxy3を通過しました。 proxy3は、リクエストのリモートアドレスとして表示されます。

これは Arnav Gupta が推奨する解決策です。 Martinx-forwarded-forが設定されていない場合のコメントで以下に提案しています。

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress
350
Edmar Miyake

エクスプレスを使用している場合...

req.ip

私はこれを見上げていた、それから私は待つようだった、私は急行を使っている。ええと。

44
Jason Sebring

_ dry _ のままにして、 IPv4 IPv6 の両方をサポートするnode-ipwareを使用することができます。

インストール:

npm install ipware

あなたのapp.jsかミドルウェアの中で:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

ユーザーのIPアドレスを取得しようとするか、127.0.0.1を返してユーザーのIPアドレスを特定できないことを示します。高度なオプションについては_ readme _ファイルを見てください。

29
un33k

ユーザーのIPアドレスを取得するには、 request-ip を使用します。それはかなりの数の異なるEdgeのケースを扱います。

開示:私はこのモジュールを作成しました

インストール:

npm install request-ip

あなたのアプリでは:

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
    next();
};

お役に立てれば

19
pbojinov

以下の機能はすべてのケースをカバーしています

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);
12

request.headers['x-forwarded-for'] || request.connection.remoteAddress

x-forwarded-forヘッダーがある場合はそれを使用し、それ以外の場合は.remoteAddressプロパティを使用します。

_ http _ または _ https _ 用に設定されたロードバランサ(または他の種類のプロキシ)を通過する要求にx-forwarded-forヘッダーが追加されます。 _ tcp _ を使用して プロキシプロトコル )レベル。これは、request.connection.remoteAddressプロパティに、クライアントのパブリックIPアドレスではなく、ロードバランサーのプライベートIPアドレスが含まれるためです。 _または_ ステートメントを上の順序で使用することで、x-forwarded-forヘッダーの存在を確認し、存在している場合はそれを使用します。それ以外の場合はrequest.connection.remoteAddressを使用します。

12
Ben Davies
function getCallerIP(request) {
    var ip = request.headers['x-forwarded-for'] ||
        request.connection.remoteAddress ||
        request.socket.remoteAddress ||
        request.connection.socket.remoteAddress;
    ip = ip.split(',')[0];
    ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"
    return ip;
}
7
Ahmad Agbaryah

IPアドレスを取得する方法は2つあります。

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

しかし、上記の方法には問題があります。

Nginxまたは他のプロキシの背後でアプリを実行している場合、すべてのIPアドレスは127.0.0.1になります。

だから、ユーザーのIPアドレスを取得するための最良の解決策は次のとおりです -

let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
7
Mansi Teharia

Expressバージョン3.x以降を使用している場合は、信頼プロキシ設定( http://expressjs.com/api.html#trust.proxy.options.table )を使用できます。 x-forwarded-forヘッダー内の一連のアドレスを使用して、信頼済みプロキシとして構成していない最新のIPをreqオブジェクトのipプロパティに追加します。

6
Michael Lang

Nodejsで単純にリモートIPを取得します。

var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
3
Dung Vu

あなたが複数のIPを取得した場合、これは私のために働きます:

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];
3
Kirill Chatrov

私はこれが死に答えられたことを理解しています、しかしここに私が書いた現代のES6バージョンはairbnbベースのeslint規格に従います。

const getIpAddressFromRequest = (request) => {
  let ipAddr = request.connection.remoteAddress;

  if (request.headers && request.headers['x-forwarded-for']) {
    [ipAddr] = request.headers['x-forwarded-for'].split(',');
  }

  return ipAddr;
};

X-Forwarded-Forヘッダーには、プロキシIPのコンマ区切りリストを含めることができます。順序はclient、proxy1、proxy2、...、proxyNです。現実の世界では、人々はこのヘッダに欲しいものを何でも供給することができるプロキシを実装します。もしあなたがロードバランサか何かの背後にいるなら、あなたは少なくともリストの最初のIPアドレスが何らかのプロキシを通過したどんなプロキシでも信頼できる。

1
Misha Nasledov

警告:

重要なレート制限のためにこれを盲目的に使用しないでください:

let ip = request.headers['x-forwarded-for'].split(',')[0];

なりすましは非常に簡単です。

curl --header "X-Forwarded-For: 1.2.3.4" "https://example.com"

その場合、ユーザーの実際のIPアドレスは次のようになります。

let ip = request.headers['x-forwarded-for'].split(',')[1];

他の回答がこれについて言及していないことに驚いています。

1
user10898116

Nginxの背後にあるノード10.14では、次のようにnginxヘッダーを介して要求することでipを取得できます。

proxy_set_header X-Real-IP $remote_addr;

その後、あなたのapp.jsで:

app.set('trust proxy', true);

それ以降は、どこに表示しても構いません。

var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;
0
Alexandru