Code de ma page IP

Il y a quelques jours, j’ai mis en place une page qui permet de récupérer son IP publique, y compris derrière certains proxy / firewall / VPN grâce à la faille WebRTC.

Voici donc le code rien que pour vous :smile:

Si vous avez des idées pour l’améliorer, n’hésitez pas !

$ipaddress = $_SERVER['REMOTE_ADDR']; //ip address


$host = gethostbyaddr($ipaddress); 

    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $realip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $realip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $realip=$_SERVER['REMOTE_ADDR'];
    }

//echo "$ipaddress;$realip;$host;";


$locationstr="http://ip-api.com/xml/";
$locationstr = $locationstr.$ipaddress;
//loading the xml file directly from the website
$xml = simplexml_load_file($locationstr); 
$countrycode = $xml->countryCode; //country code
$countryname = $xml->country; //country name
$region = $xml->regionName; //region name
$city = $xml->city; //city name
$lattitude = $xml->lat; //city latitude
$longitude = $xml->lon; //city longitude
$isp = $xml->isp; //city latitude
$noeud = $xml->as; //city longitude
//$browsername = $xml->browserName; //browser name
?>
<div class="main" style="width:950px;">
	<h2 class="post-title">Voici votre adresse IP locale : <b><?php //echo $ipaddress; ?></b></h2>
	<h2 class="post-title">Voici votre adresse IP publique : <b><?php //echo $ipaddress; ?></b></h2>
	<h2 class="post-title">Voici votre nom d'hôte : <b><?php echo $host; ?></b></h2>
	Cette adresse a été localisée dans la belle ville de <b><?php echo $city ?></b> (Région : <?php echo $region ?> / Pays : <?php echo $countryname ?>)
	<br/>(Localisation effectuée en fonction de votre FAI (<b><?php echo $isp; ?></b>) et du noeud réseau auquel vous êtes rattaché (<b><?php echo $noeud; ?></b>))
	<p>
		<center>
		<iframe width="900" height="550"frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?key=AIzaSyCRTD-ARSWquI_i1P0AlZrRPxnzmtIntd4&q=<?php echo $lattitude?>,<?php echo $longitude?>&zoom=12" allowfullscreen>
</iframe></center>
</p>
	Passez une excellente journée.
  <iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
        <script>
            //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);
            }
            //insert IP addresses into the page
            getIPs(function(ip){
                var b = document.createElement("b");
                b.textContent = ip + ' ';
                if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/))
                	//document.write(ip);
                    document.getElementsByTagName("h2")[0].appendChild(b);
                else if (ip.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/))
               		//document.write(ip);
                   document.getElementsByTagName("h2")[2].appendChild(b);
                else
                //	document.write(ip);
                    document.getElementsByTagName("h2")[1].appendChild(b);
            }
        );
                   </script>
</div>
3 « J'aime »

Moi j’aimerais bien une interface simple et épuré.
J’aime bien pouvoir “curl http://korben.info/ip

1 « J'aime »

C’est pas prévu au programme :smile:

Meeeh! C’est pourtant pratique :<!

GUI suck !
CLI > GUI :smiley:

1 « J'aime »

Ouais ! Ça c’est sympa Tonton !

Je peux l’utiliser et tenter d’en faire un outil CLI pour notre ami @Feliwyn ?

Pour un tuto à venir sur du VPN, j’en avais marre de passer par des services
comme Whatsmyip ou monip.jesaispasquoi qui fonctionnent, mais qui sont
blindés d’informations inutiles et de conneries en tout genre.

LOL.

Et toi tu nous proposes donc une page avec ta banniere, une map, l’adresse IP, des balises de titre de partout, & cie.

Perso j’aurai plus vu qqch du style

  • korben.info/ip avec : simple page sans html, juste l’ip en plaintext
  • korben.info/ip/map avec : la map en plus
  • korben.info/ip/all avec : toutes les infos séparées par des retours à la ligne
    Enfin en tout cas qqch qui soit exploitable en cli :frowning:
    Parce-que devoir ouvrir le navigateur pour avoir son ip c’est un peu pénible je trouve. Je suis de l’avis de @Feliwyn, le CLI c’est pratique des fois

La map est surement en trop oui. Après, le reste, je trouve pas ça inutile.

@Korben pour l’IP je rencontre un problème avec le service Tunnelbroker (ipv6) parfois ça affiche ma v6 et avec un refresh forcé ça met l’IPv4 du VPN que j’utilise et vice-versa… Une idée?
Pendant que j’y suis (hs), tonton tu me conseille quoi : faire passer le tunnel 6in4 par le VPN ou de le laisser en “clair”, quel est le meilleur rapport performances/sécurité d’apres toi ? Merci :smile:

ipinfo.io propose un JSON en curl

$ curl ipinfo.io
{
“ip”: “80.67.177.×××”,
“hostname”: “reverse-177-×××.fdn.fr”,
“city”: null,
“country”: “FR”,
“loc”: “48.8600,2.3500”,
“org”: “AS20766 Association Gitoyen”
}

Oui Tonton la map est peut-être en trop, même le reste (information lié a la carte) car reste incertain, pour preuve je suis mal localisé (car ville en plusieurs mot, et manque de bol le premier mot est aussi une ville a part entière). mais j’ai déjà eux le même problème ailleurs (aller on va croire que Bernard C. à le même problème pour me trouvez).

Tu n’est pas toujours localisé “dans ta ville” avec une IP, les données géographiques sont souvent approximatives.

1 « J'aime »

Oui je sais bien, car c’est le relai du FAI (celui qui à les réservations IP) qui est localiser que la box elle même, heureusement sinon avec une IP on aurai l’adresse postale exacte d’une machine. mais le script de tonton détecte bien le bon DSLAM du FAI mais après il utilise le nom associé pour donner une localisation et nom les vrai donné du DSLAM. mais rien de sensationnel (whatismyip fait la même erreur) qui mérite réellement une correction soit.

Le code de ta nouvelle page est-il dispo ?

Vu que le sujet a été up, je voulais mentionner qu’un site était plutôt pratique pour les lignes de commandes:
http://ipecho.net/plain
Vous pouvez donc curl cette URL et votre IP sera retournée. Simple, efficace.

1 « J'aime »