begin process at 2012 02 12 05:58:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > VERIFICATION D'UNE ADRESSE IP

VERIFICATION D'UNE ADRESSE IP


 Information sur la source

Note :
Aucune note
Catégorie :Réseau & Internet Classé sous :IP, adressage, reseau Niveau :Initié Date de création :06/02/2009 Date de mise à jour :06/02/2009 22:59:52 Vu :4 488

Auteur : cherifnet2002

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Verification si une adresse IP [$atester] est a l'intérieur d'une plage d'adresses donnée [$debut,$fin].

ce code a été crée pour améliorer le code source de  
New_World mis sur le site le 30/01/2009.

Source

  • <?php
  • /*
  • Verification si une adresse IP est a l'intérieur d'une plage
  • d'adresses donnée. Version Cherif BENBARCHE . 06 Fev 2009 .
  • */
  • function in_plage($debut, $fin, $atester) {
  • $x = explode(".", $debut);
  • $y = explode(".", $fin);
  • $z = explode(".", $atester);
  • // test de la correction des adresses fournies
  • $correct = 0 ;
  • for( $i = 0; $i < 4; $i++ ) {
  • $correct += (($x[$i] >= 0) AND ($x[$i] <= 255)) ? 1 : 0 ;
  • $correct += (($y[$i] >= 0) AND ($y[$i] <= 255)) ? 1 : 0 ;
  • $correct += (($z[$i] >= 0) AND ($z[$i] <= 255)) ? 1 : 0 ;
  • }
  • // conversion decimale des adresses IP fournies si toutes sont correctes
  • if( $correct == 12) {
  • $dec_debut = $x[0] * 16777216 + $x[1] * 65536 + $x[2] * 256 + $x[3] ;
  • $dec_fin = $y[0] * 16777216 + $y[1] * 65536 + $y[2] * 256 + $y[3] ;
  • $dec_atester = $z[0] * 16777216 + $z[1] * 65536 + $z[2] * 256 + $z[3] ;
  • // test de l'inclusion de l'adresse IP a tester à l'interieur de la plage spécifiée
  • $incluse = ( $dec_atester >= $dec_debut AND $dec_atester <= $dec_fin) ? TRUE : FALSE ;
  • return $incluse ;
  • } else print "Il y a ". intval(12 - $correct)."<b> erreur(s)</b> dans les adresses fournies.<br>";
  • } // end function in_plage
  • // test de la fonction in_plage
  • $debut = "192.168. 0. 0";
  • $fin = "192.168.255.255";
  • $atester = "192.168. 0.137";
  • $resultat = in_plage( $debut, $fin, $atester );
  • $string = $resultat ? " figure " : " ne figure pas ";
  • echo "L'adresse IP <b>".$atester.$string."</b>dans la plage ".$debut." à ".$fin ;
  • ?>
<?php
/*
Verification si une adresse IP est a l'intérieur d'une plage
d'adresses donnée. Version Cherif BENBARCHE . 06 Fev 2009 .
*/
function in_plage($debut, $fin, $atester) {
  $x = explode(".", $debut);
  $y = explode(".", $fin);
  $z = explode(".", $atester);
  
  // test de la correction des adresses fournies
  $correct = 0 ;

  for( $i = 0; $i < 4; $i++ ) {
    $correct += (($x[$i] >= 0) AND ($x[$i] <= 255)) ? 1 : 0 ;
    $correct += (($y[$i] >= 0) AND ($y[$i] <= 255)) ? 1 : 0 ;
    $correct += (($z[$i] >= 0) AND ($z[$i] <= 255)) ? 1 : 0 ;
  }
  
  // conversion decimale des adresses IP fournies si toutes sont correctes
  if( $correct == 12) {
    $dec_debut   = $x[0] * 16777216 + $x[1] * 65536 + $x[2] * 256 + $x[3] ;
    $dec_fin     = $y[0] * 16777216 + $y[1] * 65536 + $y[2] * 256 + $y[3] ;
    $dec_atester = $z[0] * 16777216 + $z[1] * 65536 + $z[2] * 256 + $z[3] ;
  
  // test de l'inclusion de l'adresse IP a tester à l'interieur de la plage spécifiée
  $incluse = ( $dec_atester >= $dec_debut AND $dec_atester <= $dec_fin) ? TRUE : FALSE ;
  return $incluse ;
  } else print "Il y a ". intval(12 - $correct)."<b> erreur(s)</b> dans les adresses fournies.<br>";
} // end function in_plage

// test de la fonction in_plage 
$debut   = "192.168.  0.  0";
$fin     = "192.168.255.255";
$atester = "192.168.  0.137";

$resultat = in_plage( $debut, $fin, $atester );
$string   = $resultat ? " figure " : " ne figure pas ";
echo "L'adresse IP <b>".$atester.$string."</b>dans la plage ".$debut." à ".$fin ;

?>

 Conclusion

Ce code peut servir de base à diverses manipulations
d'adresses IP.
Bon  courage.
Version 1.0 - 06 Fev 2009 .
BENBARCHE


 Historique

06 février 2009 22:59:52 :
Mise à jour de la conclusion.

 Sources de la même categorie

Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj
Source avec Zip MYGGL GOOGLE API CLASS FOR BEGINERZ par lezj
CLASSE WIKILOC par aKheNathOn

 Sources en rapport avec celle ci

COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
Source avec Zip PROTÉGER UNE PAGE PAR UN MOT DE PASSE SANS COOKIES par Hitoshi54
Source avec Zip TROUVER UNE IP ET L'AFFICHER MÊME DERRIÈRE UN PROXY par cod57
Source avec Zip RÉSEAU AMICAL par Fidji56
Source avec Zip Source avec une capture ANTI ASPIRATEUR DE SITE (ENCORE UN MAIS DIFFERENT ) par dydjy940

Commentaires et avis

Commentaire de Arto_8000 le 06/02/2009 23:37:51

Tu ne serais pas mieux d'utiliser la fonction native de PHP ip2long pour faire cela ?

<?php
function in_plage($debut, $fin, $test) {
return (ip2long($test) < ip2long($fin) && ip2long($test) > ip2long($debut));
}
?>

Aussi avec ip2long tu peux mettre des adresses incomplète du genre 127.0.0 (qui va être interprété comme 127.0.0.0), ce qui peut être pratique pour les range de IP.

Commentaire de New_World le 07/02/2009 13:16:42

bonjour

merci pour ton code j'ai pas verifié mais ça l'air de bien marché ;) .
en fait j'ai une question :-) pourquoi tu as mis $x[0] * 16777216 + $x[1] * 65536 + $x[2] * 256 + $x[3] pour la convertion j ai pas bien pigé et pourquoi tu n'a pas utiliser ip2long a t il un convenion qu'on connais pas ?

Commentaire de cherifnet2002 le 08/02/2009 22:05:04

Bonjour à tous.
Par convention (dite dot-decimal notation, ou encore dotted quad notation),
on écrit généralement une adresse IPv4 en considérant chaque octet
comme un entier non signé, donc ayant une valeur de 0 à 255 (28 -1),
en séparant les valeurs des quatre octets par des points, et en ordonnant
de l'octet ayant le poids le plus fort à celui de poids le plus faible.

Il y a donc au maximum 2^32 soit 4 294 967 296 adresses IPv4 possibles.
voir la page http://fr.wikipedia.org/wiki/Adresse_IPv4

Par exemple, pour l'adresse convertir 192.168.41.201 en decimal il faut faire
le calcul suivant :
  192 * 256^3 = 192 * 16777216 = 3221225472
+ 168 * 256^2 = 168 *    65536 =   11010048
+  41 * 256                    =      10496
+ 201                          =        201
                                 ----------
             soit un total de  = 3232246217 pour cette adresse.

Bien sur, ce calcul peut etre fait en appelant la fonction ip2long mais je
prefère faire le calcul directement, car l'appel de toute fonction est
couteux en cycles processeur et cette fonction apprehende mal l'adresse,
trés peu utilisée il est vrai, 255.255.255.255. (cf. manuel_php).

De plus, ma manière de faire peut servir pour d'autres langages ( Delphi,
C++, Perl, Python...) et est plus pédagogique et c'est pour cela que je
n'ai pas voulu utiliser d'autres formes teintées d'"ésotérisme" et qui
fonctionnent tout aussi bien :
// ...
  define("pow256_3", 16777216 );
  define("pow256_2",    65536 );
  
  $dec_debut    = $x[0] * pow(256,3) + $x[1] * pow(256,2) + $x[2] * 256 + $x[3];
  $dec_fin      = $y[0] * pow256_3   + $y[1] * pow256_2   + $y[2] * 256 + $y[3];
  $dec_atester  = ((($z[0]<<24) | ($z[1]<<16) | ($z[2]<<8) | $z[3] ) & 0x7FFFFFFF ) + 0x80000000 ;
// ...
En souhaitant que ce code et ces explications
puissent etre utiles à quelqu'un. Amicalement .

Commentaire de Arto_8000 le 09/02/2009 02:34:29

Quelques corrections à faire dans ce que cherifnet2002 a dit :

"Bien sur, ce calcul peut etre fait en appelant la fonction ip2long mais je
prefère faire le calcul directement, car l'appel de toute fonction est
couteux en cycles processeur"

Même si le fait d'appeler une méthode demande une opération au processeur, le fait que la fonction native s'exécuter beaucoup plus rapidement compense assez pour que le même code s'exécute environ 3 à 4 fois plus rapidement. Pour un language plus bas niveau comme le C/C++ ce que tu dis est vrai, mais pas pour des languages assez haut niveau comme PHP.  Voici un benchmark assez simple pour montrer cela :

Source : http://pastebin.com/m411e64d2

Résultat sur un serveur Apache 2.0.63 avec PHP 5.2.3 qui roule sur une machine Windows (avec processeur Intel) en locale :

Test #0 :
Temps pour ip2long : 1.7627670764923
Temps avec convertion manuelle : 6.8783991336823

Test #1 :
Temps pour ip2long : 1.7135169506073
Temps avec convertion manuelle : 6.823725938797

En plus la méthode ip2long te retourne false si l'adresse est invalide ce que la méthode manuelle ne fait pas.

"et cette fonction apprehende mal l'adresse,
trés peu utilisée il est vrai, 255.255.255.255. (cf. manuel_php)."

«Note: ip2long() devrait retourner FALSE pour l'adresse IP 255.255.255.255 en PHP 5 <= 5.0.2. Ce comportement a été modifié en PHP 5.0.3 où il retournait -1 (comme en PHP 4).» (Source : http://ca2.php.net/manual/fr/function.ip2long.php)

Si tu lis correctement, tu remarqueras que pour l'adresse 255.255.255.255 c'est un comportement qui est voulu et que ce n'est pas parce qu'il "apprehende mal" l'adresse.

Commentaire de cherifnet2002 le 11/02/2009 20:41:27

Je suis d'accord pour le benchmark, et c'est l'appel
légitime de la fonction explode à la ligne 21, à
l'interieur de la boucle FOR, qui est en grande partie
responsable d'un tel écart.

Par contre la fonction ip2long me cause quelques
soucis, par exemple ce test avec ce qui est à peu
près la meme adresse IP :
---------------------------------
<?php
$adresse1 = "192.168.41.201";
$adresse2 = "192.168. 41.201";
$dec_adresse1 = ip2long($adresse1);
$dec_adresse2 = ip2long($adresse2);
echo "IP : ".$adresse1 ." valeur decimale : ".$dec_adresse1."<br>";
echo "IP : ".$adresse2 ." valeur decimale : ".$dec_adresse2."<br>";
echo ($dec_adresse1 ? "VRAI<br>":"FAUX<br>");
echo ($dec_adresse2 ? "VRAI":"FAUX");
?>
---------------------------------
me donne les résultats suivants :

IP : 192.168.41.201 valeur decimale : -1062721079
IP : 192.168. 41.201 valeur decimale :
VRAI
FAUX

soit une valeur decimale négative inacceptable et un testlogique VRAI, ainsi que pas de valeur décimale et un test logique FAUX.

Pour finir, j'aimerais bien voir une solution COMPLETE et FIABLE avec la fonction ip2long à la question initiale posée :
VERIFICATION QU'UNE ADRESSE IP DONNEE EST INCLUSE OU NON DANS UNE PLAGE D'ADRESSE DONNEE.

En remerciant d'avance toutes les propositions.

Commentaire de Arto_8000 le 12/02/2009 14:41:58

Ce que tu montres ce n'est pas une question de fiabilité. Le deuxième IP est erroné en synthaxe et ip2long retourne FALSE pour un ip invalide. C'est encore une fois un comportement normal et prévu tel qu'indiqué dans la documentation que tu peux trouver sur php.net. D'autant plus qu'il n'existe théoriquement aucun cas ou tu vas avoir en entrée un adresse IP avec un espace.

Pour les nombres négatifs, c'est que ip2long retourne un entier signé. Pour le convertir en entier non-signé il existe une façon très simple :

if (($lngIP=ip2long($strIP)) < 0){$lngIP += 4294967296 ;}

En théorie le nombre retourné est bon, c'est simplement qu'il est mal interprété.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

comment diffencier 2 PC d'un reseau (meme ip) ? [ par EnDSuB ] http://endsub.free.fr voila, j'aimerai savoir comment diffencier 2 PC d'un reseau (meme ip) sans cookies ni sessions , est ce possible?< Carte reseau [ par keisuke ] Salut a tous, voila je vien de r&#233;fl&#233;chir a un petit projet que je pourrais faire, mais le probleme c'est que je n'y connais pas grand chose faire un ping d'un IP sur un reseau intranet [ par cacoucatatonique ] salut à tous je voudrais savoir s'il est possible de faire un ping d'une PING d'une plage d'IP d'un domaine et de savoir si ce ping et concluant ou pa Mysql : tri [ par jeje11991 ] bonsoir,J'ai une abse de donné avec 2 champs ip et date, donc quand on affiche tous ca fait (exemple) :127.0.0.1 25/08/2006127.45.98.54 25/08/2006...j Sélectionner les 3 premiers octets d'un IP. [ par damish ] Bonjour a tous!Voila je recherche comment faire en PHP pour séléctionner les 3 premiers octets d'un IP.En fait ce que je veut faire c'est une sécurité Erreur dans mon code [ par massbbc ] salut je suis debutant en PHP et je voudrais mettre un compteur sur mon site. Mis le compteur n'incrémente pas il reste toujopurs a un quand j'essai d [deplacé] compteur pour un site [ par massbbc ] Je debute et je veu mettre un compteur sur mon site alors voici mon code mais il n'ncrémente pas SVP aidé moi merci Compter des lignes [ par piep14 ] Bonjour, je suis en train de faire une requête pour compter des lignes !Code :<pre class="alt2" style="border: 1p Lister machines d'un reseau? [ par bastientelecom ] Bonjour à tous,Nous travaillons actuellement sur un projet qui vise à fixer un temps d'utilisation pour des PC équipée de Windows XP présents sur un r Bonjour je souhaiterais un coup de main [ par droopyv ] J'ai une base de donnée mysql, avec 1 table plusieurs champs (noms de serveurs, et adresse_ip)J'ai reussis a lier un menu deroulant sur le champs noms


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales