Para quem quer pegar o IP interno de quem está navegando em eu seu site e não sabe como fazer isso, vou disponibilizar uma função que encontrei na internet.
A função é um pouco complexa, mas utilizando-a e aplicando algumas regras nela, podemos recuperar o IP interno, ip publico e o ipv6 se disponível.
Abaixo segue o código em javascript:
//get the IP addresses associated with an account function getIPs(callback){ var ip_dups = {}; //compatibility 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.com"}]}; //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); }
para utilizar a função podemos usar o código abaixo:
getIPs(function(ip){console.log(ip);});
Para implementar e recuperar todos os ips, podemos misturar o javascript com o PHP para poder obter esses ips.
Veja, no código abaixo vamos recuperar o IP que está acessando nosso site ou aplicação e armazená-lo na variável $ip:
<?php if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } //caso utilize o cloudflare pode adicionar a linha abaixo para pegar o ip reverso $ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']); ?>
Feito isso vamos voltar para o javascript:
//aqui vamos recuperar a variável do PHP e colocar na variável javascript var ip = "<?php echo $ip;?>"; getIPs(function(ip){ //declaramos as variáveis var ipInterno , ipv6, ipPublico; //checamos o IP if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) ipInterno = ip; else if (ip.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/)) ipv6 = ip; else ipPublico = ip; });
Feito isso suas varáveis já estarão com os devidos valores preenchidos, ai é só continuar a utilizá-las.
Bom dia amigo, a função funcionou certinho, com excessão do navegador Safari. Sabe como contornar isso?