2013-11-25 10 views
49

Ich weiß, die erste Reaktion auf diese Frage ist "Nein" und "es kann nicht getan werden" und "Sie sollten es nicht brauchen, Sie tun etwas falsches". Ich versuche, die LAN-IP-Adresse des Benutzers zu erhalten und sie auf der Webseite anzuzeigen. Warum? Denn das ist, was die Seite arbeite ich an sich hat, so viele Informationen wie möglich über Sie zeigt, der Besucher: http://www.whatsmyip.org/more-info-about-you/Können Sie eine lokale LAN-IP-Adresse des Benutzers über JavaScript abrufen?

So bin ich nicht wirklich etwas zu tun mit der IP, anders als es die zeigt, Benutzer zu Informationszwecken. Ich habe das mit einem kleinen Java-Applet gemacht. Es hat ziemlich gut funktioniert. Aber heutzutage lässt dich der Browser so oft zustimmen und vertrauen, dass sogar das kleinste Java-Applet ausgeführt wird, dass ich lieber gar keins laufen lasse.

Also für eine Weile habe ich gerade diese Funktion los, aber ich würde es gerne zurück, wenn möglich. Es war etwas, das ich als Computerberater von Zeit zu Zeit benutzen würde. Es ist schneller, zu dieser Website zu gehen, um zu sehen, in welchem ​​IP-Bereich ein Netzwerk läuft, als in Systemeinstellungen, Netzwerk und dann, welche Schnittstelle auch immer aktiv ist.

Also frage ich mich, hoffe, wenn es eine Möglichkeit gibt, es in Javascript allein zu tun? Vielleicht können Sie auf ein neues Objekt zugreifen, ähnlich wie JavaScript den Browser fragt, wo sich der geografische Ort auf der Erde befindet. Vielleicht gibt es etwas ähnliches für Client-Netzwerkinformationen? Wenn nicht, vielleicht gibt es einen anderen Weg, es zu tun? Die einzigen Möglichkeiten, die ich mir vorstellen kann, sind ein Java-Applet oder ein Flash-Objekt. Ich würde lieber keinen von denen machen.

+1

Sie kennen die Antwort. Warum fragst du dann? Es ist unwahrscheinlich, dass Java-Applets oder Flash-Objekte von Benutzern zugelassen werden (möglicherweise nur von denen, die neu im Internet sind) - also ist dies im Allgemeinen keine Lösung. ActiveX und in der Nähe befindliche Sachen funktionieren nur im IE - und somit sind die Benutzer anderer Browser nicht betroffen (und mehr, sogar im IE gibt es eine Sicherheitsrichtlinie, die verhindert, dass die Website böse Dinge tut) –

+0

Meine IP-Adresse ist erfasst durch 'HTTP_X_FORWARDED_FOR' auf dieser Seite, sag einfach '. – tomdemuyt

+15

Warum fragen Sie dann? Denn vielleicht, nur vielleicht, weiß ich nicht alles. – l008com

Antwort

64

Wie sich herausstellt, ermöglicht die aktuelle WebRTC-Erweiterung von HTML5 Javascript die lokale Client-IP-Adresse abzufragen. Ein Proof of Concept ist hier verfügbar: http://net.ipcalf.com

Diese Funktion ist anscheinend by design, und ist kein Fehler. Angesichts seiner kontroversen Natur würde ich jedoch vorsichtig sein, mich auf dieses Verhalten zu verlassen. Nichtsdestotrotz denke ich, dass es Ihren beabsichtigten Zweck perfekt und angemessen adressiert (enthüllt dem Benutzer, was sein Browser leckt).

+0

Dies war hilfreich. Danke noch einmal! –

+2

Es arbeitet gerade an der Chrome und Firefox, und nicht auf dem IE, Edge oder Safari – ali

43

Zusätzlich zu afourneys Antwort funktioniert dieser Code in Browsern, die WebRTC (Chrome und Firefox) unterstützen. Ich habe gehört, dass es eine Bewegung gibt, um ein Feature zu implementieren, das Sites dazu bringt, die IP anzufordern (wie im Falle der geographischen Lage des Benutzers oder der Benutzermedien), obwohl es noch in keinem dieser Browser implementiert werden muss. Hier

ist eine modifizierte Version des source code, reduziert die Linien, so dass keine STUN-Anfragen, da Sie nur lokale IP wollen nicht die öffentliche IP:

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

Wir sind eine Dummy-Peer-Verbindung für die Remote-Erstellung sprechen Sie uns an. Wir tauschen im Allgemeinen Eiskandidaten miteinander aus und lesen die Eiskandidaten, die wir der IP des Benutzers mitteilen können.

Sie eine Demo finden ->Demo

+0

Es funktioniert nicht in Edge. Können Sie erklären warum? – dampee

+0

Danke für dieses Mido! Sehr geschätzt. –

+0

@dampee - Ich glaube, Edge unterstützt im Moment keine Datenkanäle. – MichaelB76

1

Sie weitere Informationen über das, was Einschränkungen Browser wird wahrscheinlich in den mildern diese und welche IETF tut darüber als auch, warum dies ist erforderlich bei IETF SPEC on IP handling

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

    //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); 
    }; 
} 
+0

Verwenden Sie die Editor-Optionen, um Ihren Code entsprechend zu formatieren. – 31piy

+0

Es wäre toll, wenn Sie nicht nur einen Code löschen, sondern auch erklären würden, was in seinem Code und in seinem Code passiert. Es hilft dem Autor der Frage und anderen Benutzern. Es ist gut, wenn es funktioniert, aber zu wissen, warum ist meiner Meinung nach noch wichtiger. – davejal

0

Ich räumte Midos Beitrag auf und säuberte dann die Funktion, die sie gefunden hatten. Dies wird entweder false oder array zurückgeben.Wenn Sie versuchen, erinnern, dass Sie das Array in der Web Developer-Konsole minimieren müssen, sonst ist es nicht-intuitive Standardverhalten täuscht Sie in der Annahme, dass es eine leere array zurückgibt.

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

if (window.RTCPeerConnection) 
{ 
    var 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; 
}