Auteur Sujet: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6  (Lu 74806 fois)

0 Membres et 1 Invité sur ce sujet

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #84 le: 08 mars 2016 à 19:58:20 »
perso si devais faire un projet pareil, en partant de rien, je ferais un truc "server-side only", full back-end donc, qui renvoi du HTML simple sans JS et xhr:

le client appelle ip.lafibre.info, le serveur regarde l'ip du client:
 A. si ca arrive en IPv6 via ip.lafibre.info il redirige (http redirect) sur ip4.lafibre.info/?ip6=<@ipv6 du client codée et compactée>
 B. si ca arrive en IPv6 via ipv6.lafibre.info/tov4 idem

ipv4.lafibre.info a toutes les infos coté serveur pour faire les calculs et renvoi une simple page HTML toute remplie.
(beurk sur la méthode)

Ceci me donne envie de faire un rappel concernant le Web :

Les domaines Web différents (sans liens) peuvent échanger des informations par l'intermédiaire du navigateur (sans connexion directe entre serveurs) que vous le vouliez ou non, que vous acceptiez les témoins HTTP (cookies) ou non, que vous bloquiez les témoins "tiers" (quoi que cela puisse signifier) ou non, même si vous bloquez JS.

Ces interactions complexes entre serveurs Web via le navigateur font que la notion de "tiers" est des plus vaseuses.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #85 le: 08 mars 2016 à 22:48:11 »
si tu veux détecter un 4rd Free en JS:

copier "ipaddr.min.js" de https://github.com/whitequark/ipaddr.js (ou via npm install ipaddr.js ou bower).

Ce petit bout de JS (7300 octets) permet de parser et manipuler des addresses IP.

puis ce code ci:

<script src="ipaddr.min.js">
/* https://github.com/whitequark/ipaddr.js/ */
</script>

<script>

/*
from: https://lafibre.info/free-10g-epon/zones-de-test-zmd/msg312896/#msg312896
*/

var pfx4 = ipaddr.parse("91.0.0.0");
var pfx6 = ipaddr.parse("2a01:e00::");

function is_in_Free_4rd_dom(ip6)
{
  return ip6.match(pfx6,24); // TODO: /24 is a guess, get the real Free/Iliad 4rd prefix
}

function ip6_to_ip4(ip6) {
  var ip4 = ipaddr.fromByteArray([
    pfx4.octets[0],
    ((ip6.parts[1] & 0xF) << 4) | ((ip6.parts[2] >> 8) & 0x3),
    ((ip6.parts[2] & 0x3F) <<2) | (ip6.parts[3] >> 14),
    (ip6.parts[3] >> 6) & 0xFF
    ]
  );

  return ip4;
}

function ip6_to_ip4_port_range(ip6) {
   //(ip6 << 10) & 0xc000
   return ((ip6.parts[3]>>8) & 0x3);
}

function port_range_to_range(pr) {
  switch(pr)
  {
     case 0: return {from:0    , to:16383};
     case 1: return {from:16384, to:32767};
     case 2: return {from:32768, to:49151};
     case 3: return {from:49152, to:65535};
   }
}

/*
function ip4_to_ip6(ip4,port_range)
{
    //TODO
}
*/
</script>

je l'ai mis ici aussi : https://gist.github.com/kgersen/689ad74c116d0ad1af6d#file-4rd-free-js

Exemple d'utilisation:


<script>

function testFree4rd(ip6)
{
  var addr = ipaddr.parse(ip6);
  if (is_in_Free_4rd_dom(addr))
  {
    console.log(addr.toString() + " might be in Free 4rd domain");
  }
  else
    console.log(addr.toString() + " is not in Free 4rd domain");
}

testFree4rd("2001:db8:1234::1");
testFree4rd("2a01:e0a:1:4bf0::1");

console.log("2a01:e0a:1:4bf0::1 => ipv4 = " + ip6_to_ip4(ipaddr.parse("2a01:e0a:1:4bf0::1")).toString());
var pr = ip6_to_ip4_port_range(ipaddr.parse("2a01:e0a:1:4bf0::1"));
var prt = port_range_to_range(pr);
console.log("2a01:e0a:1:4bf0::1 => port range = " + pr + " (" + prt["from"]+ "-" + prt["to"] + ")");

</script>


ca doit afficher dans la console:

2001:db8:1234::1 is not in Free 4rd domain
2a01:e0a:1:4bf0::1 might be in Free 4rd domain
2a01:e0a:1:4bf0::1 => ipv4 = 91.160.5.47
2a01:e0a:1:4bf0::1 => port range = 3 (49152-65535)


J'ai pas coder la fonction ip4_to_ip6 parce que pas le temps et mal de crane d'avoir fait ip6_to_ip4  ;D (en plus c'est pas testé donc pas garantie d'être juste).

vivien

  • Administrateur
  • *
  • Messages: 47 253
    • Twitter LaFibre.info
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #86 le: 09 mars 2016 à 21:25:01 »
Merci, kgersen, je vais le rajouter, quand il détecte une IPv6 en "2a01:e00::"

J'aimerais traiter le cas rare, mais qui existe où le navigateur préfère IPv4 à IPv6.
Dans ces cas là j'affiche l'IPv6 sur http://ip.lafibre.info/ grâce au système de json :


<li><big>Votre IPv6 publique est <font color=green><strong id="ip"></strong></font></big> (Si le champ est videc\'est que vous n\'avez pas de connectivité IPv6).</li>

puis la script :
//JavaScript pour récupérer l'IPv6, pour ceux qui sont en IPv4
if ("$IP== "IPv4")
	
echo 
'
<script>
  var xhr = new XMLHttpRequest();
  xhr.open(\'GET\', \'//ipv6-json.lafibre.info\', true);
  xhr.onload = function() { 
    var response = JSON.parse(xhr.responseText);
    for (var k in response) {
      if (response.hasOwnProperty(k)) {
      
	
var elem = document.getElementById(k);
        if (elem) elem.innerHTML = response[k];
      }
    }
  };
  xhr.send(null);
</script>'
;


La question est de comment faire pour afficher un message "IPv6 non présent" à la place d'un champ vide quand il n'a pas réussi à se connecter au nom de domaine en IPv6 only ?

Au passage, j'ai mis un log spécifique pour pouvoir récupérer les cas où l'IPv4 est par défaut mais où il y aune connectivité IPv6 qui fonctionne.

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #87 le: 09 mars 2016 à 21:47:09 »
Pourquoi pas faire l'inverse : mention <pas d'IP détectée> que tu remplaces quand tu trouves l'IP?

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #88 le: 09 mars 2016 à 21:56:48 »
oui tu met:

<strong id="ip">IPv6 non dectectée</strong>

puis le code replacera "IPv6 non dectectée" par l'IP car le code affecte innerHTML donc remplace tout ce qu'il y a dans la balise strong

tu peux aussi utilisé "xhr.onerror" mais c'est pour les erreurs de haut niveau (erreur 404 par exemple). La c'est une erreur bas niveau (pas de connexion IP ou pas de résolution DNS) donc tu ne chopera pas l'erreur avec onerror.

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #89 le: 09 mars 2016 à 21:58:15 »
Un timeout ne provoque pas d'erreur? ???

Marin

  • Client Bbox vdsl
  • Modérateur
  • *
  • Messages: 2 804
  • 73
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #90 le: 09 mars 2016 à 22:12:56 »
tu peux aussi utilisé "xhr.onerror" mais c'est pour les erreurs de haut niveau (erreur 404 par exemple). La c'est une erreur bas niveau (pas de connexion IP ou pas de résolution DNS) donc tu ne chopera pas l'erreur avec onerror.

C'est le contraire. onerror est déclenché par une erreur réseau, et c'est onload qui est appelé si une réponse 404 est bien transmise.

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #91 le: 09 mars 2016 à 22:16:28 »
http://ipv6-json.lafibre.info/


{
    "ip": "2a01:e35:XXXXXXXXXXXXXXX",
    "hostname": "2a01:e35:XXXXXXXXXXXXXXX",
    "remote_port": "<font color=red>23376</font>"
}


lol

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #92 le: 09 mars 2016 à 22:35:03 »
C'est le contraire. onerror est déclenché par une erreur réseau, et c'est onload qui est appelé si une réponse 404 est bien transmise.

opps oui exact. On a la réponse HTTP dans xhr.status (200 si ok ou sinon 404, etc).


kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #93 le: 09 mars 2016 à 23:02:05 »
par contre les nouveaux "blocks de menu" qui font bouger le texte en dessous quand on les survole, ca donne la nausée  ;D

si tu veux un style "material design" (Android recent), je te conseille MDL (Material Design Lite): https://www.getmdl.io/

Tu pars sur un simple layout puis mettre des lists par exemple.


corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #94 le: 09 mars 2016 à 23:11:11 »
Ah oui, c'est "too much".

Et pourquoi un texte en gris?

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #95 le: 09 mars 2016 à 23:27:52 »
<script>
  var xhr = new XMLHttpRequest();
  xhr.open(\'GET\', \'//ipv6-json.lafibre.info\', true);
  xhr.onload = function() {
    var response = JSON.parse(xhr.responseText);
    for (var k in response) {
      if (response.hasOwnProperty(k)) {
         var elem = document.getElementById(k);
        if (elem) elem.innerHTML = response[k];
      }
    }
  };
  xhr.send(null);
</script>
Tu laisses ipv6-json.lafibre.info modifier assez arbitrairement la page. Ici ça passe parce que ça provient du même service, mais je pense qu'il faudrait mieux énumérer les éléments qui vont être modifiés.

Ainsi, même si tu utilises un service externe pour obtenir ces infos, le piratage de la page est impossible.