노드에서 사용자의 IP 주소를 확인하는 방법
컨트롤러 내에서 지정된 요청의 IP 주소를 확인하려면 어떻게 해야 합니까?예: (익스프레스로):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
개체에는 개체라는 속성이 있습니다.그net.Socket
개체에 속성이 있으므로 다음 호출로 IP를 가져올 수 있습니다.
request.socket.remoteAddress
(노드 버전이 13 이하인 경우 지금은 사용하지 않는 것을 사용하십시오.)
편집
뒤에 있을 은 @juand 가코지서적했듯를이에트멘, 서버프시뒤록 입니다.request.headers['x-forwarded-for']
편집 2
을 할 때express
Node.js 파일:
설정하는 경우app.set('trust proxy', true)
,req.ip
프록시 뒤에 있더라도 실제 IP 주소를 반환합니다.자세한 내용은 설명서를 참조하십시오.
var ip = req.headers['x-forwarded-for'] ||
req.socket.remoteAddress ||
null;
때때로 두 개 이상의 IP 주소를 얻을 수 있습니다.req.headers['x-forwarded-for']
한또는,x-forwarded-for
헤더가 항상 설정되지 않아 오류가 발생할 수 있습니다.
필드의 일반적인 형식은 다음과 같습니다.
x-제곱-함수: client, proxy1, proxy2, proxy3
여기서 값은 쉼표+공간으로 구분된 IP 주소 목록으로, 맨 왼쪽이 원래 클라이언트이며 요청을 받은 위치에 IP 주소를 추가하여 요청을 통과한 각 연속 프록시입니다.이 예에서는 요청이 전달되었습니다.proxy1
,proxy2
,그리고 나서.proxy3
.proxy3
요청의 원격 주소로 나타납니다.
이것은 Arnav Gupta가 제안한 해결책으로 마틴이 아래의 경우에 대한 코멘트에서 제안한 해결책입니다.x-forwarded-for
설정되지 않음:
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
req.socket.remoteAddress
최신 JS를 사용한 제안:
const parseIp = (req) =>
req.headers['x-forwarded-for']?.split(',').shift()
|| req.socket?.remoteAddress
console.log(parseIp(req))
// => 127.0.0.1
익스프레스를 사용하는 경우...
제가 이걸 찾아보고 있자니 기다리기만 했어요, 급행을 이용하고 있습니다.어휴.
DRY 상태를 유지하면서 IPv4와 IPv6를 모두 지원하는 노드 IP웨어를 사용할 수 있습니다.
설치:
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 파일을 참조하십시오.
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
가 있으면 합니다. 그렇지 가▁the다▁header▁it▁use▁use"를 사용합니다. 그렇지 않으면request.connection.remoteAddress
.
Following Function에서 다루는 모든 사례가 도움이 됩니다.
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);
하지만 모두 시도해 봤지만, 효과는 없었습니다.
console.log(clientIp);
console.log(req.ip);
console.log(req.headers['x-forwarded-for']);
console.log(req.connection.remoteAddress);
console.log(req.socket.remoteAddress);
console.log(req.connection.socket.remoteAddress.split(",")[0]);
Nginx에 대한 프록시 뒤에서 Express 앱을 실행할 때 응용 프로그램 변수 신뢰 프록시를 true로 설정해야 합니다.Express는 문서에서 검토할 수 있는 몇 가지 다른 트러스트 프록시 값을 제공하지만, 아래 단계가 저에게 도움이 되었습니다.
- Express 앱에 app.set('trust proxy', true)이 있습니다.
app.set('trust proxy', true);
- 서버 블록에 대한 Nginx 구성의 $remote_addr에 대해 proxy_set_header X-Forwarded-for를 추가합니다.
location / { proxy_pass http://localhost:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; # this line proxy_cache_bypass $http_upgrade; }
- 이제 req.header('x-forwarded-for') 또는 req.connection.remoteAddress; ipfilter의 전체 코드에서 클라이언트의 IP 주소를 읽을 수 있습니다.
module.exports = function(req, res, next) { let enable = true; // true/false let blacklist = ['x.x.x.x']; let whitelist = ['x.x.x.x']; let clientIp = req.header('x-forwarded-for') || req.connection.remoteAddress; if (!clientIp) { return res.json('Error'); } if (enable && paths.some((path) => (path === req.originalUrl))) { let blacklist = blacklist || []; if (blacklist.some((ip) => clientIp.match(ip) !== null)) { return res.json({ status: 401, error: 'Your IP is black-listed !'}); } let whitelist = whitelist || []; if (whitelist.length === 0 || whitelist.some((ip) => clientIp.match(ip) !== null)) { next(); return; } else { return res.json({ status: 401, error: 'Your IP is not listed !'}); } } next(); };
경고:
중요한 속도 제한을 위해 무작정 사용하지 마십시오.
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];
저는 다른 답변들이 이것을 언급하지 않았다는 것에 놀랐습니다.
IP 주소를 가져오는 두 가지 방법이 있습니다.
let ip = req.ip
let ip = req.connection.remoteAddress;
그러나 위의 접근법에는 문제가 있습니다.
또는 뒤에서 , 는 Nginx 또는에서앱을경실우행는모 .127.0.0.1
.
따라서 사용자의 IP 주소를 얻는 가장 좋은 솔루션은 다음과 같습니다.
let ip = req.header('x-forwarded-for') || req.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;
}
nginx 뒤에 있는 노드 10.14에서는 다음과 같이 nginx 헤더를 통해 IP를 요청하여 검색할 수 있습니다.
proxy_set_header X-Real-IP $remote_addr;
그러면 앱에서.js:
app.set('trust proxy', true);
그런 다음 원하는 위치에 표시합니다.
var userIp = req.header('X-Real-IP') || req.connection.remoteAddress;
Express 버전 3.x 이상을 사용하는 경우 trust proxy 설정(http://expressjs.com/api.html#trust.proxy.options.table) 을 사용하면 x-proxy-for 헤더의 주소 체인을 걷고 신뢰할 수 있는 프록시로 구성되지 않은 체인의 최신 IP를 req 개체의 ip 속성에 넣습니다.
만약 당신이 express.js를 사용한다면,
app.post('/get/ip/address', function (req, res) {
res.send(req.ip);
})
var ipaddress = (req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).split(",")[0];
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;
req.connection
node@12.12.0 이후에는 더 이상 사용되지 않습니다.사용.req.connection.remoteAddress
클라이언트 IP를 가져오는 것은 여전히 작동할 수 있지만 권장되지 않습니다.
다행히도 node@0.5.10 이후로 존재해 왔으며 완벽한 대체품입니다.
원격 IP 주소의 문자열 표현입니다.를 들면, 들면를예,
'74.125.127.100'
또는'2001:4860:a005::68'
값은 다음과 같습니다.undefined
소켓이 파괴된 경우(예: 클라이언트의 연결이 끊어진 경우).
여기에는 많은 장점이 있었지만 포괄적인 내용은 없었습니다. 따라서 다음과 같이 사용하게 되었습니다.
function getIP(req) {
// req.connection is deprecated
const conRemoteAddress = req.connection?.remoteAddress
// req.socket is said to replace req.connection
const sockRemoteAddress = req.socket?.remoteAddress
// some platforms use x-real-ip
const xRealIP = req.headers['x-real-ip']
// most proxies use x-forwarded-for
const xForwardedForIP = (() => {
const xForwardedFor = req.headers['x-forwarded-for']
if (xForwardedFor) {
// The x-forwarded-for header can contain a comma-separated list of
// IP's. Further, some are comma separated with spaces, so whitespace is trimmed.
const ips = xForwardedFor.split(',').map(ip => ip.trim())
return ips[0]
}
})()
// prefer x-forwarded-for and fallback to the others
return xForwardedForIP || xRealIP || sockRemoteAddress || conRemoteAddress
}
저는 이것이 죽을 때까지 답이 있었다는 것을 알지만, 여기 제가 쓴 최신 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 목록이 포함될 수 있습니다.순서는 클라이언트, proxy1, proxy2, ..., proxyN입니다.현실 세계에서 사람들은 이 헤더에서 원하는 것을 무엇이든 제공할 수 있는 프록시를 구현합니다.로드 밸런서 등의 배후에 있는 경우 목록의 첫 번째 IP가 적어도 일부 요청을 통해 전송된 프록시임을 신뢰할 수 있습니다.
ipv4 형식에 사용합니다.
req.connection.remoteAddress.split(':').slice(-1)[0]
다음과 같은 Express를 사용하여 사용자 IP를 얻을 수 있습니다.
req.ip
예를 들어 이 경우 사용자 IP를 가져와 사용자 With req.ip에게 다시 보냅니다.
app.get('/', (req, res)=> {
res.send({ ip : req.ip})
})
Graphql-Yoga를 사용하는 경우 다음 기능을 사용할 수 있습니다.
const getRequestIpAddress = (request) => {
const requestIpAddress = request.request.headers['X-Forwarded-For'] || request.request.connection.remoteAddress
if (!requestIpAddress) return null
const ipv4 = new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
const [ipAddress] = requestIpAddress.match(ipv4)
return ipAddress
}
저는 nginx 뒤에 있는 express를 사용하고 있고,
req.headers.origin
나를 위해 속임수를 썼습니다.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
var ip = req.ip
console.log(ip);
res.send('Hello World!')
})
// Run as nodejs ip.js
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
속에서는 껍기속서에, ▁just.curl https://api.ipify.org
이제 node.js로 포팅하기 위해 이것을 관찰하겠습니다.
curl
웹 사이트에서 데이터를 가져오는 응용 프로그램으로, "https://api.ipify.org " 웹 사이트를 인수로 전달합니다.우리는 사용할 수 있습니다.node-fetch
를 curl
!
우리가 웹사이트에서 얻는 데이터는 우리의 IP 주소입니다. 그것은 당신의 IP를 가져오는 일종의 것입니다.
요약하자면:
const fetch = require('node-fetch');
fetch('https://api.ipify.org')
.then(response => {/* whatever */})
.catch(err => {/* whatever */})
먼저 프로젝트에 설치합니다.
import requestIp from 'request-ip';
const clientIp = requestIp.getClientIp(req);
console.log(clientIp)
하면 결과가 수 .::1
::1
는 실제 IP 주소이며 localhost에 대한 IPV6 표기법입니다.
검증자 사용유형 스크립트에 JS가 있습니다.다음은 NodeJS 미들웨어입니다.
// Extract Client IP Address
app.use((req, res, next) => {
let ipAddress = (req.headers['x-forwarded-for'] as string || '').split(',')[0]
if (!validator.isIP(ipAddress))
ipAddress = req.socket.remoteAddress?.toString().split(':').pop() || ''
if (!validator.isIP(ipAddress))
return res.status(400).json({errorMessage: 'Bad Request'})
req.headers['x-forwarded-for'] = ipAddress
next()
})
여기서는 모든 요청에 유효한 IP 주소가 있어야 하므로 유효한 IP 주소가 없으면 코드 400으로 응답을 반환합니다.
큐버넷 입력(NGINX)을 사용하는 경우:
req.headers['x-original-forwarded-for']
Node.js에서 매력적으로 작동했습니다.
우리는 노드 js에서 이 코드로 확인할 수 있습니다.
const os = require('os');
const interfaces = os.networkInterfaces();
let addresses = [];
for (var k in interfaces) {
for (var k2 in interfaces[k]) {
const address = interfaces[k][k2];
if ( (address.family === 'IPv4' || address.family === 'IPv6') &&
!address.internal) {
addresses.push(address.address);
}
}
}
console.log(addresses);
언급URL : https://stackoverflow.com/questions/8107856/how-to-determine-a-users-ip-address-in-node
'programing' 카테고리의 다른 글
vuex를 사용하여 로컬 스토리지에 저장하는 다크 모드 (0) | 2023.06.18 |
---|---|
행 가져오기의 Oracle 크기를 더 높게 설정하면 앱 속도가 느려집니까? (0) | 2023.06.18 |
문자열 입력이 숫자인지 확인하려면 어떻게 해야 합니까? (0) | 2023.06.18 |
목록의 키와 값이 0으로 기본 설정된 사전을 만들려면 어떻게 해야 합니까? (0) | 2023.06.18 |
주석과 장식가의 차이점은 무엇입니까? (0) | 2023.06.13 |