[PHP]Test Adresse IP valide [Résolu/Fermé]

Signaler
Messages postés
21
Date d'inscription
vendredi 14 avril 2006
Statut
Membre
Dernière intervention
12 juin 2006
-
 konlorice -
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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";
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 515
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)
                      {
                                      //..............
                      }
            }
}
Hello,

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

Il y a des conditions à rajouter...

A+

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
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.
// 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
Merci bien a toi, selon fonctionne parfaitement!!!!