[PHP]Test Adresse IP valide

Résolu/Fermé
chot Messages postés 21 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 12 juin 2006 - 26 avril 2006 à 17:50
 konlorice - 26 juin 2013 à 19:29
Je souhaite faire un test en php pour vérifier si l'adresse IP rentré dans mon formulaire est bien valide et du style a.b.c.d avec
0<a<256 de même pour b,c et d.
ça doit pouvoir se faire avec les strstr() ou strchr() mais je n'y arrive pas. Si quelqu'un voit une solution..... Merci

7 réponses

Bon bah voilà.... Chose promis, chose dû :
if(isset($_POST['cible'])) {
	$_POST['cible'] = htmlentities($_POST['cible']);
	/* test des ip v4 ou v6 */
	$str = strlen($_POST['cible']);
	if($str <= "15" && $str >= "4") {
		/* ipv4 preuve 1 */
		$nbrOcc = substr_count($_POST['cible'], '.');
		if($nbrOcc = "3") {
			/* ipv4 preuve 2 */
			$testIp = explode('.',$_POST['cible']);
			$i=0;
			foreach($testIp as $num) {
				if($num < 0 && $num > 255) {
					$i++;
				}
				if($i == 0 ) {
					/* preuve 3, adresse ipv4 valide :) */
				}else{
					/* adresse ipv4 invalide :( */
					echo 'ipv4 invalide';
				}
			}
			if(preg_match( "/^((?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$/m",$_POST['cible']) > 0) {
				/* preuve 4... après ça, si vous voulez plus je ne vois pas x) */
				echo 'ipv4 valide';
			} else {
				echo 'ipv4 invalide';
			}
		} else {
			/* ce n'est pas une adresse ip valide */
			echo 'ipv4 invalide !!!';
		}
	} else {
		echo 'ipv4 invalide<br/>';
	}
	if ($str <= "39" && $str >= "15") {
		/* ipv6 preuve 1 */
		$nbrOcc = substr_count($_POST['cible'], ':');
		if($nbrOcc >= "7") {
			/*ipv6 preuve 2 */
			if(preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/",$_POST['cible'])) {
				/* preuve 3, adresse ipv6 valide :) */
				echo 'ipv6 valide a';
			}else{
				/* adresse ipv6 invalide :( */
				echo 'ipv6 invalide a ';
			}
		} else {
			echo '$nbrOcc n est pas supperieur ou = à 7';
		}
	} else {
		/* ce n'est pas une adresse ip valide */
		echo 'ipv6 invalide!';
	}
}


Testé en vitesse. 2 ipv4 et 2 ipv6 fonctionnels & 2 ipv4 et 2 ipv6 non valides.
Donc voilà multiple vérification pour chaque ip. Il est possible d'extraire
chaque partie indépendamment l'une de l'autre suivant le niveau que vous souhaitez... (Plus nous avançons dans le code et plus la vérification est fiable).
15
Bonjour,
// Ca reprend l'adresse ip du client
$ip=$_SERVER["REMOTE_ADDR"];

// Sinon si le client saisie son ip avec des separateurs comme des points :
$ip=explode(".",$_REQUEST['ip']);
$controle=0;
foreach ($ip as $element) {
if ($element<0 && $element>255) $controle++;
}
if ($controle==0) echo "ip : ".$_REQUEST['ip']." valide";
else echo "ip saisie invalide";
4
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
27 avril 2006 à 08:14
Salut,

D'abord tu mets chaque élément de l'ip dans un tableau (séparé par un point), puis tu vérifies que chaque élément est un nombre valide:
$ip=explode($ip, '.');
if(sizeof($ip)==4 ){
            foreach ($ip as $element)
            {
                      if ( $element <256 && $element > 0)
                      {
                                      //..............
                      }
            }
}
2
Hello,

As-tu pensé à une adresse comme par exemple 198.162.0.25 !

Il y a des conditions à rajouter...

A+
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
renan rodrigues
8 déc. 2010 à 10:29
spidag, tu t'es trompé dans tes signes.
je conseil de mettre aussi if controle == 4 car si 3 groupe sur 4 sont valide, sera déclaré valide. valable uniquement pour ipv4.


<?php

$ip_explode = explode(".","193.252.19.3");
$nb_valide = 0;
foreach ($ip_explode as $element) {
if ($element>0 && $element<255){
$nb_valide++;
}
}
if ($nb_valide==4){
echo "<br/>ip saisie valide<br/>";
} else {
echo "<br/>ip saisie invalide<br/>";
}

?>

cordialement
1
Avec l'arrivé de l'ipv6 c'est à revoir.
Si j'ai le temps de développer la chose avec les deux options je vous enverrais ça.
0
// Vérifie si la chaîne ressemble à une adresse IP
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo 'Cette adresse IP est correcte.';
} else {
echo 'Cette adresse IP a un format non adapté.';
}

http://www.adresseip.me
0
Merci bien a toi, selon fonctionne parfaitement!!!!
0