Auteur Sujet: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6  (Lu 74741 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 #48 le: 06 mars 2016 à 20:22:38 »
Citer
Changing origin
A page may change its own origin with some limitations. A script can set the value of document.domain to its current domain or a superdomain of its current domain. If it sets it to a superdomain of its current domain, the shorter domain is used for subsequent origin checks. For example, assume a script in the document at http://store.company.com/dir/other.html executes the following statement:

document.domain = "company.com";
After that statement executes, the page can pass the origin check with http://company.com/dir/page.html (assuming http://company.com/dir/page.html sets its document.domain to "company.com" to indicate that it wishes to allow that - see document.domain for more). However, company.com could not set document.domain to othercompany.com since that is not a superdomain of company.com.

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

vivien

  • Administrateur
  • *
  • Messages: 47 211
    • Twitter LaFibre.info
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #49 le: 06 mars 2016 à 21:40:12 »
J'ai mis à jour la page https://ip.lafibre.info (je verrais plus tard, pour retirer CORS)
- Le script https://code.jquery.com/jquery-latest.pack.js est maintenant en interne. Au passage je ne comprends pas pourquoi "jquery-latest" est en version 1.11 alors que la 1.12.1 est sortie (c'est celle que j'utilise)
- L'appel à https://ipv4.lafibre.info/ip.php est fait en http, si la page parent est appelée en http et elle est appelée en https, si la page parent est appelé en https.

Mes 2 questions :
- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6

Le script php que j'utilise : (le script qui récupère l'IPv4 quand on est en IPv6 est à la fin, il me semble que c'est les recommandations de mettre les scripts juste avant </body>)

<?php
$ClientIp 
$_SERVER['REMOTE_ADDR'];//On obtient l'adresse IP
if(strstr($ClientIp,":")) {
	
$IP "IPv6";
}
else {
	
$IP "IPv4";
}
$ClientPort $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

echo 
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Quelle est mon IP ?</title>
      <meta name="description" content="Donne votre adresse IP, le reverse-DNS et le FAI associé" />
      <meta name="author" content="Vivien - https://lafibre.info" />
      <meta name="keywords" content="IP, reverse DNS" />
    </head>
<body>
<a href="https://lafibre.info"><img src="images/lafibre.png" alt="LaFibre.info" /></a>
<br />
<h4>Informations données par votre navigateur aux sites internet :</h4>
      <ul><li>'
;
if (
"$IP== "IPv4")
        echo 
'Votre IPv4 publique est <strong><font color=red>',$ClientIp,'</font></strong></li>
<li>IPv6 n\'a pas été détecté. <small>(Si vous pensez avoir une connectivité IPv6, vous pouvez forcer l\'utilisation d\'IPv6 en cliquant sur: <a href="https://ipv6.lafibre.info" title="IPv6 publique">https://ipv6.lafibre.info</a> - la page ne se chargera pas, en cas d\'absence d\'IPv6)</small>'
;
else
        echo 
'Votre IPv4 publique est <strong><font color=red><div id="ipv4"></div><div id="ipv4"></div></font></strong></li>
      <li>Votre IPv6 publique est <strong><font color=green>'
,$ClientIp,'</font></strong>';
echo 
'</li>
      <li>La version du protocole IP utilisée par défault <small>(et pour charger cette page)</small> est <strong><font color='
;

if (
"$IP== "IPv4")
        echo 
'red';
else
        echo 
'green';
echo 
'>',$IP,'</font></strong></li>
      <li>Votre nom d\'hôte '
,$IP,' ("reverse DNS") est <strong>',$ClientHost,'</strong></li>
      <li>Le port TCP source utilisé par votre connexion '
,$IP,' est <strong>';
if (
"$ClientPort"32768")
	
echo 
'<font color=red>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
else
	
echo 
'<font color=green>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
echo 
'
      <li>Le port TCP destination utilisé est <strong>'
,$_SERVER['SERVER_PORT'],'</strong></li>
      <li>Votre connexion sur cette page est <strong>'
;
if (
$_SERVER['HTTPS'] == "on")
	
echo 
'chiffrée avec https</strong></li>';
else
	
echo 
'en clair</strong></li>';
echo 
'
      <li>La version du protocole HTTP utilisée est <strong>'
,$_SERVER['SERVER_PROTOCOL'],'</strong></li>
      <li>Votre navigateur est <strong>'
,getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<br />'
;


[...]

//Script pour récupérer l'IPv4
if ("$IP== "IPv6") {
	
echo 
'<script src="js/jquery-1.12.1.min.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("http'
;

	
if (
$_SERVER['HTTPS'] == "on")
	
	
echo 
's';
	
echo 
'://ipv4.lafibre.info/ip.php");
});
</script>'
;
}

echo 
'</body>
</html>'
;
?>

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #50 le: 06 mars 2016 à 21:50:16 »
<div id="ipv4"></div><div id="ipv4">
« Modifié: 07 mars 2016 à 00:19:30 par corrector »

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 #51 le: 06 mars 2016 à 23:10:07 »
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6

Tu génères avec du code PHP équivalent ce qui devrait apparaître à cet endroit de la page, en y chargeant un fichier autre que le /ip.php ? Ou alors tu mets les données dans un JSON et tu les dispatches aux bons endroits avec un peu plus de JavaScript.

- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?

Le « <div id="ipv4"></div> » est en double. (C'est invalide, tu n'es pas censé avoir deux éléments avec le même id en HTML, si c'était voulu utiliser class="").

"http';

	
if (
$_SERVER['HTTPS'] == "on")
	
	
echo 's';
	
echo '://ipv4.lafibre.info/ip.php"

Il n'y a pas de raison d'utiliser une condition comme ça, il suffit de charger la ressource "//ipv4.lafibre.info/ip.php" et le navigateur s'adaptera automatiquement.

<script src="js/jquery-1.12.1.min.js"></script>
<
script>
$(
document).ready( function() {
   $(
"#ipv4").load("http';

	
if (
$_SERVER['HTTPS'] == "on")
	
	
echo 's';
	
echo '://ipv4.lafibre.info/ip.php"
);
});


jQuery est overkill pour ça. Tu peux aussi bien utiliser XMLHttpRequest, l'API native pour faire des requêtes en JavaScript. Le code équivalent est :

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '//ipv4.lafibre.info/ip.php', true);
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4)
            document.getElementById('ipv4').innerHTML = xhr.responseText;
    };
    xhr.send(null);
}

Et je crois que tu n'as pas besoin du window.onload (équivalent du $(document).ready()) si tu mets ton code à la fin du <body>. Le code ci-dessus prend soin de n'utiliser aucune API "récente" pour garder la compatibilité avec les vieux IE, autrement il pourrait être un peu plus succinct.

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 #52 le: 07 mars 2016 à 00:00:57 »
JQuery est plus 'parlant' et facile a comprendre pour le profane si tu veux modifier et ajouter des trucs toi-meme par la suite.

Apres s'il ne t'importe pas de comprendre comment ca fonctionne derriere ou toujours dépendre de "ceux qui savent" pour faire une petite modif ou un évolution future, dans ce cas, la solution de Marin est recommandée.

ps: si tu veux être natif, y'a xhr2 qui est un peu plus moderne ('onload' au lieu de 'onreadystatechange'):

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '//ipv4.lafibre.info/ip.php', true);
    xhr.onload = function() { document.getElementById('ipv4').innerHTML = xhr.responseText; };
    xhr.send(null);
}

« Modifié: 07 mars 2016 à 00:29:10 par kgersen »

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #53 le: 07 mars 2016 à 01:05:56 »
<?php

..............................

$ClientPort $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

..............................

      <
li>Votre navigateur est <strong>',getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<
br />';

Pourquoi appeler htmlspecialchars pour ensuite utiliser directement getenv("HTTP_USER_AGENT")?

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #54 le: 07 mars 2016 à 01:21:56 »
Le « <div id="ipv4"></div> » est en double. (C'est invalide, tu n'es pas censé avoir deux éléments avec le même id en HTML, si c'était voulu utiliser class="").
Oui d'ailleurs je l'ai juste signalé deux fois! (Bizarrement la console de Google Chrome n'affiche absolument rien à ce sujet alors qu'elle est en général assez prolixe sur les anomalies des pages Web.)

Non, ce n'est pas le souci : tu peux supprimer un <div> en interactif dans Google Chrome et cela ne corrige pas le souci.

jQuery est overkill pour ça. Tu peux aussi bien utiliser XMLHttpRequest, l'API native pour faire des requêtes en JavaScript. Le code équivalent est :
Et puis surtout je ne vois pas de gain en terme d'abstraction ou de quoi que ce soit d'autre.

Après peut être que jQuery est le langage de programmation du Web moderne et qu'il faut utiliser parce que.

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #55 le: 07 mars 2016 à 01:36:18 »
- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?
Dans ces cas là :

- ou bien tu apprends par cœur toute la spécification HTML

- ou bien tu vas consulter la doc de chaque élèment utilisé, ici DIV :

Citer
Example
A section in a document that will be displayed in blue:

<div style="color:#0000FF">
  <h3>This is a heading</h3>
  <p>This is a paragraph.</p>
</div>


Definition and Usage
The <div> tag defines a division or a section in an HTML document.

The <div> tag is used to group block-elements to format them with CSS.
http://www.w3schools.com/tags/tag_div.asp

- ou bien tu demandes au navigateur quels sont et d'où proviennent les attributs d'affichage de chaque élèment :

user agent stylesheet
div {
    display: block;
}


Et pour comprendre la fonction de l'attribut display :

Citer
CSS Syntax
display: value;

Property Values

Value    Description   
inline    Default value. Displays an element as an inline element (like <span>)
block    Displays an element as a block element (like <p>)
http://www.w3schools.com/cssref/pr_class_display.asp

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #56 le: 07 mars 2016 à 02:54:06 »
<?php
$ClientIp 
$_SERVER['REMOTE_ADDR'];//On obtient l'adresse IP
if(strstr($ClientIp,":")) {
	
$IP "IPv6";
}
else {
	
$IP "IPv4";
}
$ClientPort $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

echo 
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Quelle est mon IP ?</title>
      <meta name="description" content="Donne votre adresse IP, le reverse-DNS et le FAI associé" />
      <meta name="author" content="Vivien - https://lafibre.info" />
      <meta name="keywords" content="IP, reverse DNS" />
    </head>
<body>
<a href="https://lafibre.info"><img src="images/lafibre.png" alt="LaFibre.info" /></a>
<br />
<h4>Informations données par votre navigateur aux sites internet :</h4>
      <ul><li>'
;
if (
"$IP== "IPv4")
        echo 
'Votre IPv4 publique est <strong><font color=red>',$ClientIp,'</font></strong></li>
<li>IPv6 n\'a pas été détecté. <small>(Si vous pensez avoir une connectivité IPv6, vous pouvez forcer l\'utilisation d\'IPv6 en cliquant sur: <a href="https://ipv6.lafibre.info" title="IPv6 publique">https://ipv6.lafibre.info</a> - la page ne se chargera pas, en cas d\'absence d\'IPv6)</small>'
;
else
        echo 
'Votre IPv4 publique est <strong><font color=red><div id="ipv4"></div><div id="ipv4"></div></font></strong></li>
      <li>Votre IPv6 publique est <strong><font color=green>'
,$ClientIp,'</font></strong>';
echo 
'</li>
      <li>La version du protocole IP utilisée par défault <small>(et pour charger cette page)</small> est <strong><font color='
;

if (
"$IP== "IPv4")
        echo 
'red';
else
        echo 
'green';
echo 
'>',$IP,'</font></strong></li>
      <li>Votre nom d\'hôte '
,$IP,' ("reverse DNS") est <strong>',$ClientHost,'</strong></li>
      <li>Le port TCP source utilisé par votre connexion '
,$IP,' est <strong>';
if (
"$ClientPort"32768")
	
echo 
'<font color=red>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
else
	
echo 
'<font color=green>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
echo 
'
      <li>Le port TCP destination utilisé est <strong>'
,$_SERVER['SERVER_PORT'],'</strong></li>
      <li>Votre connexion sur cette page est <strong>'
;
if (
$_SERVER['HTTPS'] == "on")
	
echo 
'chiffrée avec https</strong></li>';
else
	
echo 
'en clair</strong></li>';
echo 
'
      <li>La version du protocole HTTP utilisée est <strong>'
,$_SERVER['SERVER_PROTOCOL'],'</strong></li>
      <li>Votre navigateur est <strong>'
,getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<br />'
;


[...]

//Script pour récupérer l'IPv4
if ("$IP== "IPv6") {
	
echo 
'<script src="js/jquery-1.12.1.min.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("http'
;

	
if (
$_SERVER['HTTPS'] == "on")
	
	
echo 
's';
	
echo 
'://ipv4.lafibre.info/ip.php");
});
</script>'
;
}

echo 
'</body>
</html>'
;
?>

Est-ce qu'on peut produire du code encore plus infect?

Est-ce qu'il existe un langage pire que PHP pour faire des pages Web?

Même le shell ferait mieux!

corrector

  • Invité
Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
« Réponse #57 le: 07 mars 2016 à 04:29:18 »
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6
La façon la plus simple (mais pas la plus flexible) de faire cela serait d'intégrer une iframe pour afficher toutes ces informations.

Mais cela ne permettra pas de faire des calculs ou des comparaisons utilisant les informations IPv4 et IPv6 en même temps.

Sinon tu généralises la méthode pour récupérer l'adresse IP, avec plus d'informations, que tu mets dans un format facile à traiter.

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 #58 le: 07 mars 2016 à 09:03:18 »
JQuery est plus 'parlant' et facile a comprendre pour le profane si tu veux modifier et ajouter des trucs toi-meme par la suite.

Apres s'il ne t'importe pas de comprendre comment ca fonctionne derriere ou toujours dépendre de "ceux qui savent" pour faire une petite modif ou un évolution future, dans ce cas, la solution de Marin est recommandée.

J'ai l'impression que c'est une solution (jQuery) qui est certes plus compacte mais ne saurait être dépeinte comme objectivement plus intuitive. Certes, il y a plein de sucre syntaxique, mais est-ce que « $("# » est censé être autrement plus « parlant / profane / moins "ceux qui savent" » pour « donne-moi l'élèment dont l'attribut ID correspond à la sous-chaîne de caractères subséquente » que l'équivalent DOM ? Dans un extrait plein de code boiterplate pour une tâche à la sortie plus ou moins basique, j'aurais bien voulu, mais là tu as à peine l'overhead des quelques paramètres XMLHttpRequest obligatoires en plus, tu survoles la doc de la page MDN et tu sais à quoi ils servent. Ce n'est peut-être pas significativement mieux que quelque chose comme $.get() et ses paramètres facultatifs à l'ordre arbitraire d'un point de vue apprentissage. Ce n'est pas parce qu'une solution jQueryifiée sort quasi-systématiquement en première position des votes Stack Overflow qu'elle est systématiquement meilleure ou plus simple, juste plus attrayante (et en plus il suffit de scroller vers la deuxième en général).

Après, attention, je ne suis pas un hater de jQuery et peux encenser son utilisation pour des projets à la couche présentation lourde (aujourd'hui, si on n'est déjà pas à un ou deux niveaux d'abstraction au dessus), et admire sa compacité utile surtout aux "ceux qui savent". Mais pour évaluer et comparer l'intuitivité de deux solutions auprès d'un débutant, il faut les mettre sur un banc similaire d'un point de vue fonctionnel et penser ergonomie. Ici, un indicateur constructif pourrait être le caractère sommaire et sobre technologiquement qu'on peut prêter et vouloir prêter à la page que vivien a (commencé à) construire : on parle souvent stats avec des extraits d'User-Agent exotiques sur les forums, ou des sujets comme ceux-ci, vouloir présenter une interface simple et universelle pour afficher ce genre d'information peut s'inscrire dans une démarche d'unification et de proposition d'une interface qui fonctionne même sur le navigateur de stock de ton Amiga avec une dégradation en mode meilleure effort (voire de minimalisme) ?
Rien que ça, ça donne une valeur extérieure au projet, d'une manière qui peut le démarquer intrinsèquement de l'exemple du chapitre 2-Site du Zéro pour lui donner des lettres d'utilité voire de raison individuelle d'être, et commencer par ne pas charger ≃ 100 Ko de code générique depuis une ressource externe en SSL pour l'équivalent de 3 à 4 lignes peut être une bonne base pour ne pas faire pire par la suite.

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 #59 le: 07 mars 2016 à 11:45:29 »
Si on va dans ce sens, il faut carrèment ne pas faire de JS et de XHR non plus, peut-être une simple iframe ?

Comme toujours en programmation il y a des compromis à  faire en fonction de plusieurs critères dont l'un des 1ers est l'objectif.
La on ne sait pas trop ou Vivien veut aller a terme, lui non plus surement. Ca commence par une simple page, puis des choses d'ajoutent au fur et a mesure. Demain ca serait peut-être la géoloc et les n° d'AS ? certe on peut tout faire en JS basique mais à  partir d'un certain seuil de complexité , un simple framework peut éventuellement améliorer les choses (ou les aggraver ... ca arrive).

C'est certain que pour remplacer 5 lignes de JS c'est overkill mais si le projet grossit ca peut être une bonne base des le départ plutôt que de devoir réécrire tout a un moment. Et a t'on besoin d'apprendre 100% du JS natif pour faire des choses simples et efficaces en JQuery ?

Je pense qu'il vaut mieux lui présenter plusieurs choix techniques et les +/- de chacun, d'autant s'il veut faire plus tard par lui-meme plutôt que de toujours dépendre d'autres. Il faut qu'il fasse aussi un choix a un moment en fonction de la cible visée, s'il y en a une.

Il faut qu'il pense aussi a la taille de la population susceptible de l'aider, y'a pas forcement que nous. JQuery a l'avantage d'être très pratiqué donc le 'potentiel' d'assistance est plus large que du JS natif (assistance = recherche web aussi).

Apres personnellement  je n'aime pas JQuery ni JS d'ailleurs. Je trouve tout cet éco-systeme JS déplorable mais bon on n'a pas trop le choix en ce moment meme si les choses évoluent lentement.
« Modifié: 07 mars 2016 à 17:45:31 par kgersen »