Programing

노드에서 사용자의 IP 주소를 확인하는 방법

lottogame 2020. 3. 11. 00:44
반응형

노드에서 사용자의 IP 주소를 확인하는 방법


컨트롤러 내에서 주어진 요청의 IP 주소를 어떻게 확인할 수 있습니까? 예를 들어 (명시 적으로) :

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

당신의에서 request객체라는 속성이 connectionA는, net.Socket객체. net.Socket 객체에는 속성이 있으므로이 remoteAddress호출로 IP를 얻을 수 있어야합니다.

request.connection.remoteAddress

httpnet 설명서를 참조하십시오

편집하다

@juand가 주석에서 지적했듯이 서버가 프록시 뒤에있는 경우 원격 IP를 얻는 올바른 방법은 다음과 같습니다. request.headers['x-forwarded-for']


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

에서 (으)로 둘 이상의 IP 주소를 얻을 수 있습니다 req.headers['x-forwarded-for']. 또한 x-forwarded-for오류가 발생할 수 있는 헤더가 항상 설정되지는 않습니다.

필드의 일반적인 형식은 다음과 같습니다.

x 전달 : client, proxy1, proxy2, proxy3

여기서 값은 쉼표 + 공백으로 구분 된 IP 주소 목록이며, 가장 왼쪽은 원래 클라이언트이며 요청을받은 각 연속 프록시는 요청을받은 IP 주소를 추가합니다. 이 예에서, 요청은 통과 proxy1, proxy2다음 proxy3. proxy3요청의 원격 주소로 나타납니다.

이것은 Arnav GuptaMartinx-forwarded-for설정하지 않은 경우에 대한 주석에서 제안한 수정 사항으로 제안한 솔루션 입니다.

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

Express를 사용하는 경우 ...

req.ip

나는 이것을 찾고 있었고, 나는 기다렸고, 나는 표현을 사용하고있다. 어.


DRY 를 유지 하고 IPv4IPv6을 모두 지원 하는 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 주소를 얻으려고 최선을 다하거나 사용자의 IP 주소를 127.0.0.1확인할 수 없음을 표시하기 위해 돌아갑니다 . README 파일에서 고급 옵션을 살펴보십시오 .


request-ip를 사용 하여 사용자의 IP 주소를 검색 할 수 있습니다 . 그것은 여러 가지 다른 경우를 처리하며, 그중 일부는 다른 답변에서 언급됩니다.

공개 :이 모듈을 만들었습니다

설치:

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();
};

도움이 되었기를 바랍니다


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

경우 x-forwarded-for헤더가 다음 그렇지 않으면 사용, 그것을 사용하는 .remoteAddress속성을.

x-forwarded-for헤더에 설정 부하 분산 (또는 프록시 다른 유형)를 통과 요청에 추가 HTTP 또는 HTTPS (그것은에서 균형 때 요청에이 헤더를 추가 할 수도 있습니다 TCP의 사용 수준 프록시 프로토콜 ). request.connection.remoteAddress속성에 클라이언트의 퍼블릭 IP 주소가 아닌로드 밸런서의 프라이빗 IP 주소가 포함 되기 때문 입니다. 위의 순서대로 OR을 사용하여 x-forwarded-for헤더 의 존재를 확인하고 존재 하는 경우이를 사용하십시오 request.connection.remoteAddress.


다음 기능은 모든 경우에 적용됩니다.

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);

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 주소를 얻는 방법에는 두 가지가 있습니다.

  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;

Express 버전 3.x 이상을 사용하는 경우 신뢰 프록시 설정 ( http://expressjs.com/api.html#trust.proxy.options.table )을 사용하면 주소 체인이 x-forwarded-for 헤더를 사용하고 신뢰할 수있는 프록시로 구성하지 않은 체인에 최신 ip를 req 객체의 ip 속성에 넣습니다.


여러 개의 IP를 얻는다면 다음과 같이 작동합니다.

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


nodejs에서 간단한 원격 IP 가져 오기 :

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

나는 이것이 죽음에 대한 답을 얻었음을 알고 있지만, 여기에 필자가 작성한 에어 ESB 기반의 eslint 표준을 따르는 현대 ES6 버전이 있습니다.

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는 적어도 일부 요청이 통과 한 프록시가 무엇인지 신뢰할 수 있습니다.


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;

경고:

중요한 속도 제한을 위해 이것을 맹목적으로 사용하지 마십시오.

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];

다른 답변이 이것을 언급하지 않은 것에 놀랐습니다.


같은 문제가 있었지만 자바 스크립트에서도 새로운 것이었지만 req.connection.remoteAddress 로이 문제를 해결했습니다. 그것은 나에게 IP 주소 (그러나 ipv6 형식 :: ffff.192.168.0.101)와 .slice 를 제공하여 7 번째 숫자를 제거했습니다.

var ip = req.connection.remoteAddress;

if (ip.length < 15) 
{   
   ip = ip;
}
else
{
   var nyIP = ip.slice(7);
   ip = nyIP;
}

참고 URL : https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node

반응형