नोड में उपयोगकर्ता का आईपी पता कैसे निर्धारित किया जाए


349

मैं किसी नियंत्रक से दिए गए अनुरोध का IP पता कैसे निर्धारित कर सकता हूं? उदाहरण के लिए (एक्सप्रेस में):

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

22
यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो आप req.ip स्रोत का उपयोग कर सकते हैं - expressjs.com/en/api.html#req.ip
FrickeFresh


16
जो लोग काम कर रहे हैं localhost- जैसे मैंने किया, नीचे सभी उत्तर के लिए परिणाम (लगभग सभी उत्तर काम करता है) आ सकते हैं ::1। इससे मुझे कुछ समय के लिए उलझन हुई। बाद में पता चला कि ::1यह असली आईपी एड्रेस है और IPV6लोकलहोस्ट के लिए नोटेशन है। Hope this helps someone
प्रमेश बजराचार्य

जवाबों:


452

आपकी requestवस्तु में एक संपत्ति connectionहोती है, जो एक net.Socketवस्तु होती है। Net.Socket ऑब्जेक्ट में एक गुण होता है remoteAddress, इसलिए आपको इस कॉल के साथ IP प्राप्त करने में सक्षम होना चाहिए:

request.connection.remoteAddress

Http और नेट के लिए प्रलेखन देखें

संपादित करें

जैसा कि @juand टिप्पणियों में बताती है, रिमोट आईपी प्राप्त करने की सही विधि, यदि सर्वर एक प्रॉक्सी के पीछे है, है request.headers['x-forwarded-for']


6
यह मुझे एक आईपी एड्रेस देता है जो मुझे whatismyip.com से अलग है। ऐसा क्यों होगा?
शामून

3
मेरे पास मेरी API सेवा एक no.de उदाहरण पर स्थापित है । मैं अपने कंप्यूटर से यह उपयोग करने के लिए प्रयास करते हैं, मैं आईपी है "67.250.AAA.BBB" मेरी असली दुनिया, जबकि "10.2.XXX.YYY" के एक आईपी पते मिल
Shamoon

7
यह अनुरोध है।
हेडर

4
ध्यान दें कि net.Stream अब net.Socket है, और प्रलेखन यहाँ रहता है: nodejs.org/api/net.html#net_class_net_socket
monsur

4
request.headers['x-forwarded-for']
हरोकू

408
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']। इसके अलावा, एक x-forwarded-forहेडर हमेशा सेट नहीं किया जाएगा जो एक त्रुटि फेंक सकता है।

क्षेत्र का सामान्य प्रारूप है:

एक्स-अग्रेषित-के लिए: client, proxy1, proxy2, proxy3

जहाँ मान IP पते की अल्पविराम + स्पेस से अलग की गई सूची है, जहाँ सबसे मूल ग्राहक है, और प्रत्येक क्रमिक प्रॉक्सी जिसने IP पता जोड़ते हुए अनुरोध पारित किया है जहाँ से उसे अनुरोध प्राप्त हुआ है। इस उदाहरण में, अनुरोध के माध्यम से पारित proxy1, proxy2, और फिर proxy3proxy3अनुरोध के दूरस्थ पते के रूप में प्रकट होता है।

यह समाधान है जो अर्नव गुप्ता द्वारा तय किए गए मार्टिन ने मामलों के लिए टिप्पणियों में नीचे सुझाया है जब x-forwarded-forसेट नहीं किया गया है:

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

9
हालांकि इन हेडर के स्पूफिंग को कैसे रोकें?
डोमी

8
यह आमतौर पर अच्छी तरह से काम करता है, लेकिन किसी कारण से मुझे हाल ही में त्रुटि मिली "अपरिभाषित की संपत्ति 'रिमोटएड्रेस' नहीं पढ़ सकता है" क्योंकि जाहिर तौर पर सब कुछ अशक्त / अपरिभाषित था, सहित req.connection.socket। मुझे यकीन नहीं है कि ऐसा क्यों / किन स्थितियों के कारण होता है, लेकिन यह जांचना अच्छा होगा कि req.connection.socketऐसा होने पर आपके सर्वर के दुर्घटनाग्रस्त होने से बचने के लिए मौजूद है।
मैट ब्राउन ने

9
अंतिम पंक्ति req.connection.socket.remoteAddress थ्रोइंग एरर। सावधानी से हो।
yAnTar

11
लौटाया गया IP पता :: 1 है। क्यों?
Bagusflyer

3
जिस तरह से पॉप () काम करता है, उसे देखकर ऐसा लगता है जैसे आपको आखिरी प्रॉक्सी मिलने वाली है न कि क्लाइंट जो आपको चाहिए। क्या मै गलत हु?
मिशेल

85

यदि एक्सप्रेस का उपयोग कर रहा है ...

req.ip

मैं इसे देख रहा था तब मैं इंतजार कर रहा था, मैं एक्सप्रेस का उपयोग कर रहा हूं। ओह।


यदि सर्वर प्रॉक्सी के पीछे चल रहा है तो 127.0.0.1 की भिन्नता लौटाएगा। एडमर के उत्तर का उपयोग करें या x-real-ip सेट करें
डैन डैस्कलेस्क्यू

31

आप DRY में रह सकते हैं और केवल नोड-आईपीवेयर का उपयोग कर सकते हैं जो IPv4 और IPv6 दोनों का समर्थन करता है ।

इंस्टॉल:

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

यह उपयोगकर्ता के आईपी पते को प्राप्त करने के लिए सबसे अच्छा प्रयास करेगा या 127.0.0.1यह इंगित करने के लिए रिटर्न देगा कि यह उपयोगकर्ता के आईपी पते को निर्धारित नहीं कर सका। उन्नत विकल्पों के लिए README फ़ाइल पर एक नज़र डालें ।


40
"या यह बताने के लिए 127.0.0.1 लौटाता है कि यह उपयोगकर्ता के IP पते को निर्धारित नहीं कर सका" 127.0.0.1 और अज्ञात के बीच काफी बड़ा अंतर है ...
नेपॉक्सक्स

4
यह मेरे लिए कुछ अजीब लौट आया :ffff:(not my IP address)जब हरोकू से परीक्षण किया गया। @ edmar-miyake का जवाब मेरे लिए ठीक से काम कर रहा है।
निलोक

मुझे आश्चर्य है कि अगर आप 'x-फॉरवर्डेड-फॉर' केस में right2left लुकअप का उपयोग करते हैं तो IP क्या होगा? var ip_info = get_ip (req, right_most_proxy = True), जैसा कि कुछ सेटअप में है, क्लाइंट IP सही आईपी हो सकता है।
un33k

2
वह विधि clientIp: '::1'मेरे लिए लौट रही है। यह काम करने के लिए प्रतीत नहीं होता है।
जमैफुलफर

@JamEngulfer - ipware केवल तभी काम करता है जब आपके पते को अनुरोध के माध्यम से आपके ऐप के लिए ठीक से पास किया गया हो []। उदाहरण: AWS LBS 'एक्स-फ़ॉर्वर्ड-फॉर' में Ip पता भेजता है जबकि कस्टम NginX कई अन्य चर का उपयोग करते हैं। आईपीवेयर आईपी पते का पता लगाने का सबसे अच्छा प्रयास करता है, लेकिन केवल अगर आईपी हेडर में नीचे पारित किया गया है।
un33k

19

उपयोगकर्ता के आईपी पते को पुनः प्राप्त करने के लिए आप अनुरोध-आईपी का उपयोग कर सकते हैं । यह अलग-अलग किनारे के मामलों में से कुछ को संभालता है, जिनमें से कुछ अन्य उत्तरों में उल्लिखित हैं।

प्रकटीकरण: मैंने यह मॉड्यूल बनाया है

इंस्टॉल:

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

उम्मीद है की यह मदद करेगा


2
पैकेज रिक्वेस्ट-आई पी के सोर्स कोड को github.com/pbojinov/request-ip/blob/master/index.js पर चेक करना, यह एक्स-फॉरवर्ड की जाँच करता है-और एडब्ल्यूएस ईएलबी, क्लाउडफ्लेयर जैसे लोकप्रिय लोड बैलर के लिए अन्य हेडर के सभी प्रकार। , अकामाई, नंगेक्स, रैकस्पेस एलबी और रिवरबेड्स स्टिंग्रे
जियोर्जियो

1
यह nullमेरे लिए लौटता है।
S.M_Emamian

इसके बजाय एक ही चीज़ का उपयोग करेंrequest.headers['x-forwarded-for']
प्रथमेश

19

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

यदि x-forwarded-forहेडर है तो उसका उपयोग करें, अन्यथा .remoteAddressसंपत्ति का उपयोग करें ।

x-forwarded-forहैडर अनुरोध करता है कि लोड बैलेंसर्स (या प्रॉक्सी के अन्य प्रकार) के लिए स्थापित के माध्यम से पारित करने के लिए जोड़ा जाता है HTTP या HTTPS (यह भी है जब एक में संतुलन अनुरोध करने के लिए इस शीर्ष लेख जोड़ना संभव नहीं है टीसीपी स्तर का उपयोग कर प्रॉक्सी प्रोटोकॉल )। ऐसा इसलिए है क्योंकि request.connection.remoteAddressसंपत्ति में क्लाइंट के सार्वजनिक आईपी पते के बजाय लोड बैलेंसर का निजी आईपी पता होगा। OR कथन का उपयोग करके , ऊपर दिए गए क्रम में, आप x-forwarded-forशीर्ष लेख के अस्तित्व की जांच करते हैं और इसका उपयोग करते हैं यदि यह मौजूद है तो अन्यथा उपयोग करें request.connection.remoteAddress


12

फंक्शन के बाद कवर किए गए सभी मामलों में मदद मिलेगी

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

नोट ips , मेरे लिए एक है।
थॉमसरेजी

8

आईपी ​​एड्रेस प्राप्त करने के दो तरीके हैं:

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

लेकिन उपरोक्त दृष्टिकोण के साथ एक समस्या है।

यदि आप अपना ऐप Nginx या किसी भी प्रॉक्सी के पीछे चला रहे हैं, तो हर एक IP एड्रेस होगा 127.0.0.1

तो, उपयोगकर्ता का आईपी पता प्राप्त करने का सबसे अच्छा समाधान है: -

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

6

यदि आप एक्सप्रेस संस्करण 3.x या अधिक का उपयोग कर रहे हैं, तो आप विश्वास प्रॉक्सी सेटिंग ( http://expressjs.com/api.html#trust.proxy.options.table ) का उपयोग कर सकते हैं और यह पतों की श्रृंखला को आगे बढ़ाएगा एक्स-फॉरवर्ड किए गए हेडर के लिए और नवीनतम आईपी को उस चेन में डाल दें जिसे आपने रीक ऑब्जेक्ट पर आईपी प्रॉपर्टी में एक विश्वसनीय प्रॉक्सी के रूप में कॉन्फ़िगर नहीं किया है।


6

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


1
आप सही हैं, यदि आप आईपी को स्ट्रिंग के रूप में चाहते हैं, तो आप अंतिम पंक्ति को इसके साथ बदल सकते हैं: ip = ip.split (':')। Slice (-1) [0]
अहमद अगरबरी

कोड-केवल उत्तर हतोत्साहित किए जाते हैं। क्या आप बता सकते हैं कि यह उत्तर पुराने से बेहतर कैसे है, बेहतर तरीके से समझाया गया है, और (बहुत) अधिक उत्कीर्ण उत्तर ?
डेन डैस्कलेस्क्यू

5

चेतावनी:

केवल महत्वपूर्ण दर-सीमितता के लिए आँख बंद करके इसका उपयोग न करें:

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

इसे बिगाड़ना बहुत आसान है:

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

उस स्थिति में उपयोगकर्ता का वास्तविक आईपी पता होगा:

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

मुझे आश्चर्य है कि किसी अन्य उत्तर ने इसका उल्लेख नहीं किया है।


शीर्ष जवाब से इस संभाल करता pop()सरणी है, जो सूचकांक 1 है, जो किया जा सकता है पर तत्व प्राप्त करने से अधिक सामान्य है से ing मूर्ख बनाया द्वारा curl --header "X-Forwarded-For: 1.2.3.4, 5.6.7.8" "https://example.com"
डैन डैस्कलेस्क्यू


3

नोडज में सरल दूरस्थ आईपी प्राप्त करें:

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

3

10.14 नोड में, nginx के पीछे, आप इस तरह से nginx हेडर के माध्यम से अनुरोध करके आईपी प्राप्त कर सकते हैं:

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;

2

मुझे लगता है कि यह मौत के लिए उत्तर दिया गया है, लेकिन यहाँ एक आधुनिक 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- फ़ॉर्वर्ड-फॉर हेडर में प्रॉक्सी आईपी की अल्पविराम से अलग सूची हो सकती है। आदेश क्लाइंट, प्रॉक्सी 1, प्रॉक्सी 2, ..., प्रॉक्सीएन है। वास्तविक दुनिया में, लोग उन प्रॉक्सी को लागू करते हैं जो इस हेडर में जो चाहें आपूर्ति कर सकते हैं। यदि आप एक लोड बैलेंसर या कुछ के पीछे हैं, तो आप कम से कम सूची में पहले आईपी पर भरोसा कर सकते हैं जो कुछ अनुरोधों के माध्यम से आया है।


1

यदि आप ग्राफ़िकल-योग का उपयोग कर रहे हैं, तो आप निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं:

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
}


1

मैं nginx और के पीछे एक्सप्रेस का उपयोग कर रहा हूँ

req.headers.origin

मेरे लिए चाल चली


-7

एक ही समस्या थी ... जावास्क्रिप्ट में भी नया है, लेकिन मैं इसे 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;
}

यह एक अच्छी विधि नहीं है, क्योंकि ipv6 सिर्फ 7 अंक + आईपीवी 4 नहीं है, लेकिन पूरी तरह से अलग हो सकता है।
राडेक

@Radek यदि आप पता की शुरुआत को मान्य है, यह कल्पना के अनुरूप है (देखें en.wikipedia.org/wiki/IPv6_address "आईपीवी 4-मैप किया गया" के लिए Ctrl-F खोज) ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))यदि ... उपरोक्त कोड में जगह लेंगे
अनसिंक्रनाइज़्ड

मैं व्यक्तिगत रूप से getClientIp () को npm रिक्वेस्ट-आईपी से लपेटता हूं, function getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }जो कि पहले से प्राप्त किए गए आईपैक को स्वीकार करता है, या इनपुट के रूप में एक रिक्वेस्ट ऑब्जेक्ट को स्वीकार करता है और परिणाम के रूप में आईपी या अपरिभाषित देता है
अनसंकटेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.