নোডে কোনও ব্যবহারকারীর আইপি ঠিকানা কীভাবে নির্ধারণ করবেন


349

আমি কীভাবে কোনও নিয়ামকের মধ্যে থেকে প্রদত্ত অনুরোধের আইপি ঠিকানা নির্ধারণ করতে পারি? উদাহরণস্বরূপ (প্রকাশে):

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

22
আপনি যদি এক্সপ্রেস ব্যবহার করেন তবে আপনি req.ip উত্সটি ব্যবহার করতে পারেন - expressjs.com/en/api.html#req.ip
ফ্রেঞ্চফ্রেশ

এটি চেষ্টা করুন: github.com/indutny/node-ip
স্টিফেন গত

16
যারা কাজ করে যাচ্ছেন localhost- যেমন আমি করেছি, নীচের সমস্ত উত্তরের ফলাফল (প্রায় সমস্ত উত্তর কাজ করে) আসতে পারে ::1। এটি আমাকে কিছু সময়ের জন্য বিভ্রান্ত করেছে। পরে খুঁজে পাওয়া গেল যে ::1আসল আইপি ঠিকানা এবং IPV6লোকালহোস্টের জন্য স্বরলিপি। Hope this helps someone
বজ্রাচার্য

উত্তর:


452

আপনার requestঅবজেক্টে একটি সম্পত্তি বলা হয় connectionযা একটি net.Socketঅবজেক্ট। নেট.সকেট অবজেক্টটির একটি সম্পত্তি রয়েছে remoteAddress, সুতরাং আপনি এই কল দিয়ে আইপি পেতে সক্ষম হবেন:

request.connection.remoteAddress

HTTP এবং এর জন্য ডকুমেন্টেশন দেখুন নেট এর

সম্পাদনা

যেহেতু @ জ্যান্ড মন্তব্যগুলিতে উল্লেখ করেছেন, সার্ভার যদি প্রক্সিটির পিছনে থাকে তবে দূরবর্তী আইপি পাওয়ার সঠিক পদ্ধতিটি হ'ল request.headers['x-forwarded-for']


6
এটি আমাকে আইটি অ্যাড্রেস দেয় যা আইটেমসাইপ ডট কম যা দেয় তা থেকে আলাদা। কেন হবে?
শামুন

3
আমি আমার এপিআই পরিষেবাটি একটি নোডের উদাহরণে ইনস্টল করেছি । আমি যখন এটি আমার কম্পিউটার থেকে অ্যাক্সেস করার চেষ্টা করি তখন আমি "10.2.XXX.YYY" এর আইপি ঠিকানা পাই যেখানে আমার আসল ওয়ার্ল্ড আইপি "67.250.AAA.BBB"
শামুন


4
নোট net.Stream এখন net.Socket, এবং ডকুমেন্টেশন এখানে লাইভ রয়েছে যে: nodejs.org/api/net.html#net_class_net_socket
মনসুর

4
যার আগ্রহী, request.headers['x-forwarded-for']
হিরোকুর

407
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

যেখানে মানটি হ'ল কমা + স্পেস দ্বারা বিভক্ত আইপি ঠিকানাগুলির তালিকা, বাম-সর্বাধিক মূল ক্লায়েন্ট এবং প্রতিটি ক্রমাগত প্রক্সি যেখানে অনুরোধটি পেয়েছে সেখানকার আইপি ঠিকানা যুক্ত করে অনুরোধটি পাস করেছে। এই উদাহরণে, অনুরোধ মাধ্যমে গৃহীত 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.sket.remoteAdress ছোঁড়া ত্রুটি সাবধানে.
yAnTar

11
ফিরে আসা আইপি ঠিকানাটি হল: 1 কেন?
বাগসফ্লায়ার

3
পপ () কীভাবে কাজ করে তা দেখে মনে হচ্ছে আপনি শেষ প্রক্সি পাবেন এবং আপনি যে ক্লায়েন্টটি চান তা নয়। আমি কি ভূল?
মিশেল

84

এক্সপ্রেস ব্যবহার করা হলে ...

req.ip

আমি এটি সন্ধান করছিলাম তখন আমি অপেক্ষা করার মতো ছিলাম, আমি এক্সপ্রেস ব্যবহার করছি। Duh।


127.0.0.1 এর বৈচিত্রটি ফিরিয়ে আনবে যদি সার্ভারটি কোনও প্রক্সিের পিছনে চলছে। এডমারের উত্তর ব্যবহার করুন বা এক্স-রিয়েল-আইপি সেট করুন
ড্যান ড্যাসক্লেস্কু

31

আপনি DRY থাকতে পারেন এবং কেবল নোড-আইপওয়ার ব্যবহার করতে পারেন যা আইপিভি 4 এবং আইপিভি 6 উভয় সমর্থন করে ।

ইনস্টল করুন:

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 প্রদান করে" 127.0.0.1 এবং অজানা মধ্যে বেশ বড় পার্থক্য আছে ...
নেপোকক্স

4
:ffff:(not my IP address)হিরোকু থেকে পরীক্ষা করার সময় এটি আমার জন্য অদ্ভুত কিছু ফিরিয়েছিল । @ এডমার-মিয়াকে উত্তর আমার পক্ষে সঠিকভাবে কাজ করছে।
নিলোক

আমি ভাবছি আপনি যদি 'এক্স-ফরওয়ার্ড-ফর' ক্ষেত্রে ডান 2 বাম চেহারাটি ব্যবহার করেন তবে আইপিটি কী হবে। var ip_info = get_ip (req, ডান_মোস্ট_প্রক্সি = ট্রু), কিছু সেটআপ হিসাবে, ক্লায়েন্টের আইপি সবচেয়ে সঠিক আইপি হতে পারে।
un33k

2
এই পদ্ধতিটি clientIp: '::1'আমার জন্য ফিরছে । এটি কাজ করে বলে মনে হচ্ছে না।
জামেঙ্গুলার

@ জামেঙ্গুল্ফার - আইপি ঠিকানাটি সঠিকভাবে আপনার অ্যাপ্লিকেশনটিতে অনুরোধ.হেডার্সের মাধ্যমে প্রেরণ করা হলে আইপওয়্যারটি কেবল কাজ করে। উদাহরণ: এডাব্লুএস এলবিএস আইপি ঠিকানাটি 'এক্স-ফরওয়ার্ড-ফর' এ প্রেরণ করে যখন কাস্টম এনগিনএক্স অনেকে অন্যান্য ভেরিয়েবল ব্যবহার করে। আইপিওয়্যারটি আইপি অ্যাড্রেসটি বের করার সর্বোত্তম চেষ্টা করে তবে কেবল আইপিটি শিরোনামগুলির মধ্যে দিয়ে যায়।
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']
Prathamesh আরো

19

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

যদি x-forwarded-forশিরোনামটি থাকে তবে তা ব্যবহার করুন, অন্যথায় এটি ব্যবহার করুন.remoteAddress সম্পত্তি।

x-forwarded-forহেডার অনুরোধ লোড balancers (অথবা প্রক্সি অন্যান্য ধরনের) জন্য সেট আপ মধ্য দিয়ে পাস যোগ করা হয় HTTP- র বা HTTPS দ্বারা (এটা যখন একটি সময়ে মিট অনুরোধ এই হেডার যোগ করার জন্য সম্ভব বিভিন্ন TCP স্তর ব্যবহার প্রক্সি প্রোটোকল )। কারণ request.connection.remoteAddressসম্পত্তিটিতে ক্লায়েন্টের পাবলিক আইপি ঠিকানার পরিবর্তে লোড ব্যালান্সারের ব্যক্তিগত আইপি ঠিকানা থাকবে। একটি ব্যবহারের বা উপরে অনুক্রমে বিবৃতি, আপনি একটি অস্তিত্ব জন্য চেক 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);

নোট আইপস , আমার মধ্যে একটি মধ্যে আছে ।
টমাসরেগি

8

আইপি ঠিকানা পাওয়ার দুটি উপায় রয়েছে:

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress;

তবে উপরোক্ত পদ্ধতির সাথে একটি সমস্যা রয়েছে।

আপনি যদি নিজের অ্যাপ্লিকেশন Nginx বা কোনও প্রক্সি পিছনে চালাচ্ছেন তবে প্রতিটি আইপি ঠিকানা হবে 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 ( ':') ফালি (-1) [0]।
আহমাদ Agbaryah

কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়। আপনি কী ব্যাখ্যা করতে পারবেন যে উত্তরটি কীভাবে পুরানো, আরও ভাল ব্যাখ্যা করা হয়েছে এবং (আরও) বেশি উত্তোলিত উত্তরগুলির চেয়ে ভাল ?
ড্যান ড্যাসক্লেস্কু

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 ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];



3

নোড 10.14 এ, এনগিনেক্সের পিছনে, আপনি আইপিটি এনজিঙ্ক্স শিরোনামের মাধ্যমে অনুরোধ করে এটি পুনরুদ্ধার করতে পারেন:

proxy_set_header X-Real-IP $remote_addr;

তারপরে আপনার অ্যাপ্লিকেশনটিতে:

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

এক্স-ফরওয়ার্ড-ফর শিরোনামে প্রক্সি আইপিগুলির একটি কমা-বিচ্ছিন্ন তালিকা থাকতে পারে। অর্ডারটি ক্লায়েন্ট, প্রক্সি 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
}


-7

একই সমস্যা ছিল ... আমি জাভাস্ক্রিপ্টেও নতুন কিন্তু আমি এটি req.connection.remoteAddress দিয়ে সমাধান করেছি; এটি আমাকে আইপি ঠিকানা দিয়েছে (তবে ipv6 ফর্ম্যাটে :: ffff.192.168.0.101) এবং তারপরে s প্রথম সংখ্যাটি সরাতে স্লাইস করুন

var ip = req.connection.remoteAddress;

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

এটি একটি ভাল পদ্ধতি নয়, কারণ আইপিভি 6টি কেবল 7 ডিজিটের + আইপিভি 4 নয়, তবে সম্পূর্ণ আলাদা হতে পারে।
রাদেক

@Radek যদি আপনি ঠিকানাটি শুরুর যাচাই, এটা বৈশিষ্ট কে কনর্ফাম করে (দেখুন en.wikipedia.org/wiki/IPv6_address "IPv4- র-ম্যাপ" জন্য Ctrl-F অনুসন্ধান) ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))যদি ... উপরে কোডে প্রতিস্থাপন করবে
unsynchronized

আমি ব্যক্তিগতভাবে এনটিএম রিকোয়েস্ট-আইপি থেকে getClientIp () জড়ান 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)); }যা কোনও পূর্ববর্তী আইপি, বা একটি অনুরোধ অবজেক্টকে ইনপুট হিসাবে গ্রহণ করে এবং আইপি দেয় বা ফলস্বরূপ অপরিবর্তিত
অবিচ্ছিন্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.