क्या आप एक उपयोगकर्ता को स्थानीय लैन आईपी पता वाया जावास्क्रिप्ट प्राप्त कर सकते हैं?


102

मुझे पता है कि इस सवाल पर शुरुआती प्रतिक्रिया "नहीं" है और "यह नहीं किया जा सकता है" और "आपको इसकी आवश्यकता नहीं होनी चाहिए, आप कुछ गलत कर रहे हैं"। मैं जो करने की कोशिश कर रहा हूं वह उपयोगकर्ताओं को लैन आईपी पता मिलता है, और इसे वेब पेज पर प्रदर्शित करता है। क्यों? क्योंकि यही वह पृष्ठ है जिस पर मैं काम कर रहा हूं, जो आपके बारे में अधिक से अधिक जानकारी दिखा रहा है, आगंतुक: http://www.whatsmyip.org/more-info-about-you/

इसलिए मैं वास्तव में सूचना के प्रयोजनों के लिए उपयोगकर्ता को दिखाने के अलावा, आईपी के साथ कुछ भी नहीं कर रहा हूं। मैं एक छोटे जावा एप्लेट का उपयोग करके ऐसा करता था। इसने बहुत अच्छा काम किया। लेकिन इन दिनों, ब्राउज़र आपको बहुत बार सहमत और भरोसा करता है, यहां तक ​​कि सबसे मामूली जावा एप्लेट को चलाने के लिए, कि मैं एक को बिल्कुल नहीं चलाऊंगा।

इसलिए कुछ समय के लिए मैं इस सुविधा से मुक्त हो गया, लेकिन यदि संभव हो तो मैं इसे वापस चाहूंगा। यह कुछ ऐसा था जो मैं, कंप्यूटर सलाहकार के रूप में, वास्तव में समय-समय पर उपयोग करता था। यह देखने के लिए इस वेबसाइट पर जाने के लिए तेज़ है कि आईपी रेंज एक नेटवर्क पर क्या चल रहा है, इससे सिस्टम वरीयताएँ, नेटवर्किंग और फिर जो भी इंटरफ़ेस सक्रिय है, उसमें जाना है।

तो मैं सोच रहा हूँ, उम्मीद है, अगर वहाँ जावास्क्रिप्ट में यह करने के लिए कुछ रास्ता है? हो सकता है कि कुछ नई वस्तु जो आप एक्सेस कर सकते हैं, उसी तरह जैसे जावास्क्रिप्ट ब्राउज़र से पूछ सकता है कि पृथ्वी पर भौगोलिक स्थिति कहाँ है। शायद ग्राहक नेटवर्किंग जानकारी के लिए कुछ इसी तरह से? यदि नहीं, तो शायद यह पूरी तरह से करने के लिए किसी अन्य तरीके से? केवल एक ही तरीका मैं सोच सकता हूं कि एक जावा एपलेट या एक फ्लैश ऑब्जेक्ट है। मैं बल्कि उन में से नहीं करना चाहते हैं।


1
आप जवाब जानते हैं। फिर क्यों पूछ रहा है? जावा एप्लेट या फ्लैश ऑब्जेक्ट को उपयोगकर्ताओं द्वारा अनुमति नहीं दी जा सकती है (केवल उन लोगों द्वारा हो सकती है जो इंटरनेट में नए हैं) - इसलिए यह आम मामले में समाधान नहीं है। ActiveX और आस-पास का सामान केवल IE में काम कर रहा है - और, इस प्रकार, अन्य ब्राउज़रों के उपयोगकर्ता प्रभावित नहीं होंगे (और, यहां तक ​​कि IE में भी एक सुरक्षा नीति है जो वेब-साइट को खराब काम करने से रोकती है)
अल्मा दो

मेरा IP पता HTTP_X_FORWARDED_FORउस पृष्ठ पर, केवल Sayin` के माध्यम से कैप्चर किया गया है।
टोमडेमुइट

50
फिर क्यों पूछते हैं? क्योंकि हो सकता है, बस हो सकता है, मैं सब कुछ नहीं जानता।
l008com

1
ये लोग करते हैं: whatismyproxy.com
बजे

1
@ लाइकबाइक नाइस वन। यह देखते हुए कि वे यह कैसे कर रहे हैं।
डोमिनिक सेरिसानो

जवाबों:


117

जैसा कि यह पता चला है, एचटीएमएल 5 का हालिया वेबआरटीसी एक्सटेंशन जावास्क्रिप्ट को स्थानीय क्लाइंट आईपी पते को क्वेरी करने की अनुमति देता है। अवधारणा का एक प्रमाण यहाँ उपलब्ध है: http://net.ipcalf.com

यह सुविधा स्पष्ट रूप से डिजाइन द्वारा है , और बग नहीं है। हालांकि, इसकी विवादास्पद प्रकृति को देखते हुए, मैं इस व्यवहार पर भरोसा करने के लिए सतर्क रहूंगा। फिर भी, मुझे लगता है कि यह पूरी तरह से और उचित रूप से आपके इच्छित उद्देश्य को दर्शाता है (उपयोगकर्ता को पता चलता है कि उनका ब्राउज़र लीक हो रहा है)।


1
यह मददगार था। एक बार फिर धन्यवाद!
Ansuraj खड़ंगा

7
यह सिर्फ क्रोम और फ़ायरफ़ॉक्स पर काम कर रहा है, और आईई, एज या सफारी पर नहीं है
अली

मैं अपना WAN IP देख रहा था और इस वेबसाइट whatismyip.com ने मुझे अपना स्थानीय IP भी दिया और मुझे लगता है कि इसका JS के साथ कुछ लेना-देना था।
शयन

@ali आप सही हैं, मैंने ऊपर जिस वेबसाइट का उल्लेख किया है, वह मेरे स्थानीय आईपी को एज पर बताने में सक्षम नहीं है।
शयन

6
Google Chrome डिफ़ॉल्ट रूप से स्थानीय IP छिपा रहा है। यह e87e041d-15e1-4662-adad-7a6601fca9fb.local के समान कुछ दिखाता है । यह व्यवहार चर सेट करके परिवर्तन हो सकता है # सक्षम-WebRTC-हाइड-स्थानीय-आईपीएस-mDNS साथ करने के लिए विकलांग क्रोम में: // flags
injaon

81

अपडेट करें

यह समाधान अधिक समय तक काम नहीं करेगा क्योंकि ब्राउज़र वेबब्रक लीक को ठीक कर रहे हैं: उस पर अधिक जानकारी के लिए इस अन्य प्रश्न को पढ़ें: RTCIceCandidate अब वापस आने वाला IP नहीं


Afourney के उत्तर के अलावा यह कोड उन ब्राउज़रों में काम करता है जो WebRTC (क्रोम और फ़ायरफ़ॉक्स) का समर्थन करते हैं। मैंने सुना है कि एक ऐसी सुविधा को लागू करने के लिए एक आंदोलन चल रहा है जो साइटों को आईपी का अनुरोध करता है (जैसे उपयोगकर्ता के भू-स्थान या उपयोगकर्ता-मीडिया के मामले में) हालांकि यह अभी भी उन ब्राउज़रों में से किसी एक में लागू किया जाना है।

यहां स्रोत कोड का एक संशोधित संस्करण है , लाइनों को कम कर दिया है, कोई स्टन अनुरोध नहीं कर रहा है क्योंकि आप केवल लोकल आईपी नहीं सार्वजनिक आईपी चाहते हैं:

window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;//compatibility for Firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};      
pc.createDataChannel('');//create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop);// create offer and set local description
pc.onicecandidate = function(ice)
{
 if (ice && ice.candidate && ice.candidate.candidate)
 {
  var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
  console.log('my IP: ', myIP);   
  pc.onicecandidate = noop;
 }
};

हम हमसे संपर्क करने के लिए दूरस्थ सहकर्मी के लिए एक डमी सहकर्मी कनेक्शन बना रहे हैं। हम आम तौर पर एक दूसरे के साथ बर्फ उम्मीदवारों का आदान-प्रदान करते हैं और बर्फ के उम्मीदवारों को पढ़कर हम उपयोगकर्ता के आईपी को बता सकते हैं।

आप पर एक डेमो पा सकते हैं -> डेमो


इस Mido के लिए धन्यवाद! बहुत सराहना की।
सुजय फड़के

1
@ डंपी - मेरा मानना ​​है कि एज फिलहाल डेटा चैनलों का समर्थन नहीं करता है।
माइकलबी76

एक फर्जी डेटा चैनल क्या है? गूगल पर कोई संदर्भ नहीं मिल सकता है
AmazingTurtle

2
ध्यान दें कि createOffer api को सफलता और कॉलबैक के बजाय वादा पर आधारित होने के लिए स्विच किया गया है, इसलिए यह नए संस्करणों पर काम नहीं कर सकता है, देखें: developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/…
डिकेलेथ

10

WebRTC API ग्राहक की स्थानीय आईपी पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है।

हालाँकि ब्राउज़र इसका समर्थन नहीं कर सकता है, या ग्राहक ने सुरक्षा कारणों से इसे निष्क्रिय कर दिया होगा। किसी भी मामले में, किसी को इस "हैक" पर लंबे समय तक भरोसा नहीं करना चाहिए क्योंकि यह भविष्य में पैच होने की संभावना है (देखें कुलेन फ्लफी जेनिंग्स का जवाब)।

नीचे ECMAScript 6 कोड दर्शाता है कि यह कैसे करना है।

/* ES6 */
const findLocalIp = (logInfo = true) => new Promise( (resolve, reject) => {
    window.RTCPeerConnection = window.RTCPeerConnection 
                            || window.mozRTCPeerConnection 
                            || window.webkitRTCPeerConnection;

    if ( typeof window.RTCPeerConnection == 'undefined' )
        return reject('WebRTC not supported by browser');

    let pc = new RTCPeerConnection();
    let ips = [];

    pc.createDataChannel("");
    pc.createOffer()
     .then(offer => pc.setLocalDescription(offer))
     .catch(err => reject(err));
    pc.onicecandidate = event => {
        if ( !event || !event.candidate ) {
            // All ICE candidates have been sent.
            if ( ips.length == 0 )
                return reject('WebRTC disabled or restricted by browser');

            return resolve(ips);
        }

        let parts = event.candidate.candidate.split(' ');
        let [base,componentId,protocol,priority,ip,port,,type,...attr] = parts;
        let component = ['rtp', 'rtpc'];

        if ( ! ips.some(e => e == ip) )
            ips.push(ip);

        if ( ! logInfo )
            return;

        console.log(" candidate: " + base.split(':')[1]);
        console.log(" component: " + component[componentId - 1]);
        console.log("  protocol: " + protocol);
        console.log("  priority: " + priority);
        console.log("        ip: " + ip);
        console.log("      port: " + port);
        console.log("      type: " + type);

        if ( attr.length ) {
            console.log("attributes: ");
            for(let i = 0; i < attr.length; i += 2)
                console.log("> " + attr[i] + ": " + attr[i+1]);
        }

        console.log();
    };
} );

सूचना मैं लिखता हूं return resolve(..)या return reject(..)शॉर्टकट के रूप में। वे दोनों कार्य कुछ भी नहीं लौटाते हैं।

तब आपके पास यह कुछ हो सकता है:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Local IP</title>
</head>
<body>
    <h1>My local IP is</h1>
    <p id="ip">Loading..</p>
    <script src="ip.js"></script>
    <script>
    let p = document.getElementById('ip');
    findLocalIp().then(
        ips => {
            let s = '';
            ips.forEach( ip => s += ip + '<br>' );
            p.innerHTML = s;
        },
        err => p.innerHTML = err
    );
    </script>
</body>
</html>

9

मैंने मिडो की पोस्ट को साफ किया और फिर उन्हें मिलने वाले फंक्शन को साफ किया। यह या तो वापस आ जाएगी falseया एक array। परीक्षण करते समय याद रखें कि आपको वेब डेवलपर कंसोल में सरणी को संक्षिप्त करने की आवश्यकता है अन्यथा यह nonintuitive डिफ़ॉल्ट व्यवहार है यह सोचकर आपको धोखा दे सकता है कि यह खाली लौट रहा है array

function ip_local()
{
 var ip = false;
 window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || false;

 if (window.RTCPeerConnection)
 {
  ip = [];
  var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
  pc.createDataChannel('');
  pc.createOffer(pc.setLocalDescription.bind(pc), noop);

  pc.onicecandidate = function(event)
  {
   if (event && event.candidate && event.candidate.candidate)
   {
    var s = event.candidate.candidate.split('\n');
    ip.push(s[0].split(' ')[4]);
   }
  }
 }

 return ip;
}

इसके अलावा कृपया लोगों को ध्यान में रखें कि यह सीएसएस की तरह कुछ पुराना-नया नहीं है, border-radiusहालांकि उन बिट्स में से एक जो IE11 और पुराने द्वारा एकमुश्त समर्थित नहीं हैहमेशा ऑब्जेक्ट डिटेक्शन का उपयोग करें, यथोचित पुराने ब्राउज़रों में परीक्षण करें (जैसे फ़ायरफ़ॉक्स 4, IE9, ओपेरा 12.1) और सुनिश्चित करें कि आपकी नई स्क्रिप्ट आपके कोड के नए बिट्स नहीं तोड़ रही हैं। साथ ही हमेशा के मानकों के अनुरूप कोड का पता लगाने के लिए पहले तो अगर वहाँ एक सीएसएस उपसर्ग मानक गैर उपसर्ग कोड का पता लगाने का कहना है के साथ कुछ है पहले और फिर वापस दीर्घकालिक समर्थन में के रूप में गिर अंततः इसे के अस्तित्व के आराम के लिए मानकीकृत किया जाएगा।


आप redeclaring कर रहे हैं ip- लाइन 3 और लाइन 8.
user2757813

@Anu WebRTC को इंटरनेट एक्सप्लोरर 15 (या "एज 15") तक पेश नहीं किया गया था इसलिए नहीं। इसीलिए ऊपर की चौथी पंक्ति में यदि कोई भी वस्तु मौजूद नहीं है, तो फ़ंक्शन गलत होगा। यदि IE में इसे प्राप्त करने का एक और तरीका है तो मुझे इस समय इसकी जानकारी नहीं है।
जॉन

@ जॉन - हम php वैरिएबल पर रिटर्न वैल्यू कैसे पास करते हैं? एक छिपी हुई पोस्ट?
मार्कोज़ेन

@MarcoZen <input name="example1" type="hidden" value="whatever" />ऐसी स्थिति में आप या तो AJAX POST का उपयोग कर सकते हैं या कर सकते हैं । मैं ajax()यहाँ अपने कार्य का अध्ययन करने की अत्यधिक सलाह देता हूँ : jabcreations.com/docs/javascript
John

बस पता चला है कि कुछ ब्राउज़र (जैसे क्रोम) अब आईपी प्रदान करते हैं - एक ही कोड अब एक mDNS होस्टनाम का समाधान करता है, अगर कोई वीडियो / ऑडियो अनुमति नहीं मांगी जाती है। देखें groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
क्रिस्टोफ Bimminger

6

function getUserIP(onNewIP) { //  onNewIp - your listener function for new IPs
  //compatibility for firefox and chrome
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
  var pc = new myPeerConnection({
      iceServers: []
    }),
    noop = function() {},
    localIPs = {},
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
    key;

  function iterateIP(ip) {
    if (!localIPs[ip]) onNewIP(ip);
    localIPs[ip] = true;
  }
  onNewIP
  //create a bogus data channel
  pc.createDataChannel("");

  // create offer and set local description
  pc.createOffer().then(function(sdp) {
    sdp.sdp.split('\n').forEach(function(line) {
      if (line.indexOf('candidate') < 0) return;
      line.match(ipRegex).forEach(iterateIP);
    });

    pc.setLocalDescription(sdp, noop, noop);
  }).catch(function(reason) {
    // An error occurred, so handle the failure to connect
  });

  //listen for candidate events
  pc.onicecandidate = function(ice) {
    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
    ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
  };
}
getUserIP(console.log)


अपने कोड को उचित रूप से प्रारूपित करने के लिए कृपया संपादक विकल्पों का उपयोग करें।
31piy

3
यह बहुत अच्छा होगा यदि आप न केवल कुछ कोड छोड़ेंगे, बल्कि यह भी बताएंगे कि उसके और आपके कोड में क्या चल रहा है। यह प्रश्न लेखक और अन्य उपयोगकर्ताओं की मदद करता है। यह अच्छा है अगर यह काम करता है, लेकिन यह जानना कि मेरी राय में और भी महत्वपूर्ण क्यों है।
डावजल १४'१

कोई IE संगत समाधान?
अनु

1
टिप्पणी इस लेख का एक कॉपी पेस्ट है: ourcodeworld.com/articles/read/257/…
Darkshifty

बस पता चला है कि कुछ ब्राउज़र (जैसे क्रोम) अब आईपी प्रदान करते हैं - एक ही कोड अब एक mDNS होस्टनाम का समाधान करता है, अगर कोई वीडियो / ऑडियो अनुमति नहीं मांगी जाती है। देखें groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU
क्रिस्टोफ Bimminger

5

क्रोम 76+

पिछले साल मैंने जावास्क्रिप्ट के माध्यम से अपने स्थानीय आईपी को सफलतापूर्वक खोजने के लिए लिनब्लो के उत्तर (2018-अक्टूबर -19) का उपयोग किया। हालाँकि, हाल के क्रोम अपडेट (76?) ने इस पद्धति को जीत लिया है ताकि यह अब एक ओफ़्फ़ुसेटेड आईपी लौटाए, जैसे:1f4712db-ea17-4bcf-a596-105139dfd8bf.local

यदि आपके पास अपने ब्राउज़र पर पूर्ण नियंत्रण है, तो आप इसे Chrome फ्लैग्स में बंद करके इस व्यवहार को पूर्ववत कर सकते हैं, इसे अपने एड्रेस बार में टाइप करके:

chrome://flags

और झंडे को प्रदर्शित करना Anonymize local IPs exposed by WebRTC

मेरे मामले में, मुझे अपने वर्तमान स्थान का निर्धारण करने और अपने स्थान के आधार पर अलग-अलग काम करने के लिए एक टेम्परमंकी स्क्रिप्ट के लिए आईपी की आवश्यकता होती है। मेरा अपनी ब्राउज़र सेटिंग्स (कोई कॉर्पोरेट नीतियां आदि) पर भी पूर्ण नियंत्रण नहीं है। तो मेरे लिए, chrome://flagsसेटिंग को बदलना चाल है।

सूत्रों का कहना है:

https://groups.google.com/forum/#!topic/discuss-webrtc/6stQXi72BEU

https://codelabs.developers.google.com/codelabs/webrtc-web/index.html


वह झंडा हट सकता है। वर्तमान में ऐसा लगता है कि एक्सटेंशन अभी भी आईपी प्राप्त करते हैं इसलिए आप इसे पृष्ठभूमि स्क्रिप्ट से प्राप्त करने का प्रयास कर सकते हैं। दीर्घकालिक सभी दांव हालांकि बंद हैं।
फिलिप हेंके

1
Group.google.com/forum/# ​​.topic / discuss-webrtc / 6stQXi72BEU के अनुसार , यदि आप अपने समाधान को कार्यान्वित करते हैं, तो भी ऑडियो / वीडियो अनुमति का अनुरोध करने पर आईपी को लौटा दिया जाना चाहिए।
क्रिस्टोफ बिमिंगर

4

आप इस बारे में अधिक जानकारी प्राप्त कर सकते हैं कि ब्राउज़र किस सीमा तक इसे कम करने की संभावना बढ़ाएगा और आईईटीएफ इसके बारे में क्या कर रहा है और साथ ही आईपी ​​से निपटने पर आईईटीएफ की आवश्यकता क्यों है।


0

एक RTCPeerConnectionका उपयोग किया जा सकता है। Chrome जैसे ब्राउज़र में जहां getUserMediaअनुमति की आवश्यकता होती है , हम केवल उपलब्ध इनपुट डिवाइसों का पता लगा सकते हैं और उनके लिए अनुरोध कर सकते हैं।

const internalIp = async () => {
    if (!RTCPeerConnection) {
        throw new Error("Not supported.")
    }

    const peerConnection = new RTCPeerConnection({ iceServers: [] })

    peerConnection.createDataChannel('')
    peerConnection.createOffer(peerConnection.setLocalDescription.bind(peerConnection), () => { })

    peerConnection.addEventListener("icecandidateerror", (event) => {
        throw new Error(event.errorText)
    })

    return new Promise(async resolve => {
        peerConnection.addEventListener("icecandidate", async ({candidate}) => {
            peerConnection.close()

            if (candidate && candidate.candidate) {
                const result = candidate.candidate.split(" ")[4]
                if (result.endsWith(".local")) {
                    const inputDevices = await navigator.mediaDevices.enumerateDevices()
                    const inputDeviceTypes = inputDevices.map(({ kind }) => kind)

                    const constraints = {}

                    if (inputDeviceTypes.includes("audioinput")) {
                        constraints.audio = true
                    } else if (inputDeviceTypes.includes("videoinput")) {
                        constraints.video = true
                    } else {
                        throw new Error("An audio or video input device is required!")
                    }

                    const mediaStream = await navigator.mediaDevices.getUserMedia(constraints)
                    mediaStream.getTracks().forEach(track => track.stop())
                    resolve(internalIp())
                }
                resolve(result)
            }
        })
    })
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.