コントローラ内から特定の要求のIPアドレスを確認する方法を教えてください。例えば(急行で):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
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アドレスを追加して要求を渡した各連続プロキシこの例では、要求はproxy1
、proxy2
、そしてproxy3
を通過しました。 proxy3
は、リクエストのリモートアドレスとして表示されます。
これは Arnav Gupta が推奨する解決策です。 Martin はx-forwarded-for
が設定されていない場合のコメントで以下に提案しています。
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
_ 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 _ファイルを見てください。
ユーザーの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();
};
お役に立てれば
以下の機能はすべてのケースをカバーしています
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);
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
を使用します。
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;
}
IPアドレスを取得する方法は2つあります。
let ip = req.ip
let ip = req.connection.remoteAddress;
しかし、上記の方法には問題があります。
Nginxまたは他のプロキシの背後でアプリを実行している場合、すべてのIPアドレスは127.0.0.1
になります。
だから、ユーザーのIPアドレスを取得するための最良の解決策は次のとおりです -
let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
Expressバージョン3.x以降を使用している場合は、信頼プロキシ設定( http://expressjs.com/api.html#trust.proxy.options.table )を使用できます。 x-forwarded-forヘッダー内の一連のアドレスを使用して、信頼済みプロキシとして構成していない最新のIPをreqオブジェクトのipプロパティに追加します。
Nodejsで単純にリモートIPを取得します。
var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
あなたが複数のIPを取得した場合、これは私のために働きます:
var ipaddress = (req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).split(",")[0];
私はこれが死に答えられたことを理解しています、しかしここに私が書いた現代の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アドレスが何らかのプロキシを通過したどんなプロキシでも信頼できる。
重要なレート制限のためにこれを盲目的に使用しないでください:
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];
他の回答がこれについて言及していないことに驚いています。
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;