[PHP]Test Adresse IP valide

Résolu
chot Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
 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
A voir également:

7 réponses

H3R05
 
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
spidag
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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
anonymous
 
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
 
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
H3R05
 
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
adresse ip
 
// 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
konlorice
 
Merci bien a toi, selon fonctionne parfaitement!!!!
0