network programming - Native javascript way to get user's IP address - Stack Overflow

It seems impossible to get your IP address with pure javascript without recurring to external services

It seems impossible to get your IP address with pure javascript without recurring to external services or server side code.

My question is: why didn't the language implement this feature natively? After all, the browser should know "its" IP address.

It seems impossible to get your IP address with pure javascript without recurring to external services or server side code.

My question is: why didn't the language implement this feature natively? After all, the browser should know "its" IP address.

Share Improve this question edited Sep 3, 2015 at 19:13 gen_Eric 227k42 gold badges303 silver badges342 bronze badges asked Sep 3, 2015 at 19:05 friolfriol 7,1064 gold badges49 silver badges82 bronze badges 4
  • The browser knows it's IP address, sure. Why do you need it? You can't get it from the browser for security reasons. – gen_Eric Commented Sep 3, 2015 at 19:14
  • 1 Actually, you can get the user's IP address with JavaScript. WebRTC has a security flaw (read: feature) that can get both your external and internal IPs. Have a gander at ipleak, it uses code based off github./diafygi/webrtc-ips – gen_Eric Commented Sep 3, 2015 at 19:15
  • 1 My question was simpler: why doesn't native Javascript have a "getMyIP()" function? – friol Commented Sep 4, 2015 at 5:47
  • I'd say it's just for security/privacy. Though, with the code from github./diafygi/webrtc-ips, JavaScript basically does have a getMyIP() function. – gen_Eric Commented Sep 4, 2015 at 13:10
Add a ment  | 

1 Answer 1

Reset to default 7

You actually can the user's IP address using vanilla JavaScript. WebRTC has a security flaw (read: feature) that lets get both the user's external and even internal (LAN) IP addresses.

Have a look at this GitHub project: https://github./diafygi/webrtc-ips

//get the IP addresses associated with an account
function getIPs(callback){
    var ip_dups = {};

    //patibility for firefox and chrome
    var RTCPeerConnection = window.RTCPeerConnection
        || window.mozRTCPeerConnection
        || window.webkitRTCPeerConnection;
    var useWebKit = !!window.webkitRTCPeerConnection;

    //bypass naive webrtc blocking using an iframe
    if(!RTCPeerConnection){
        //NOTE: you need to have an iframe in the page right above the script tag
        //
        //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
        //<script>...getIPs called in here...
        //
        var win = iframe.contentWindow;
        RTCPeerConnection = win.RTCPeerConnection
            || win.mozRTCPeerConnection
            || win.webkitRTCPeerConnection;
        useWebKit = !!win.webkitRTCPeerConnection;
    }

    //minimal requirements for data connection
    var mediaConstraints = {
        optional: [{RtpDataChannels: true}]
    };

    var servers = {iceServers: [{urls: "stun:stun.services.mozilla."}]};

    //construct a new RTCPeerConnection
    var pc = new RTCPeerConnection(servers, mediaConstraints);

    function handleCandidate(candidate){
        //match just the IP address
        var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
        var ip_addr = ip_regex.exec(candidate)[1];

        //remove duplicates
        if(ip_dups[ip_addr] === undefined)
            callback(ip_addr);

        ip_dups[ip_addr] = true;
    }

    //listen for candidate events
    pc.onicecandidate = function(ice){

        //skip non-candidate events
        if(ice.candidate)
            handleCandidate(ice.candidate.candidate);
    };

    //create a bogus data channel
    pc.createDataChannel("");

    //create an offer sdp
    pc.createOffer(function(result){

        //trigger the stun server request
        pc.setLocalDescription(result, function(){}, function(){});

    }, function(){});

    //wait for a while to let everything done
    setTimeout(function(){
        //read candidate info from local description
        var lines = pc.localDescription.sdp.split('\n');

        lines.forEach(function(line){
            if(line.indexOf('a=candidate:') === 0)
                handleCandidate(line);
        });
    }, 1000);
}

//Test: Print the IP addresses into the console
getIPs(function(ip){console.log(ip);});

Check out the demo: https://diafygi.github.io/webrtc-ips/

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745278903a4620182.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信