John_attend Posté 16 Octobre 2006 Posté 16 Octobre 2006 Bonjour à tous, Voici quelques lignes de code : <?if($var >= "0" && $var <= "30"){echo 'La variable $var est un nombre';}?> Est ce que ces lignes équivalent EXACTEMENT à ces lignes : <?if($var >= "0" && $var <= "30" && is_numeric($var)){echo 'La variable $var est un nombre';}?> En gros, est ce que le fait de mettre $var >= "0" && $var <= "30" voudra forcément dire que $var est un nombre, y a t'il un moyen de contourner cela, c'est une question de sécurité quant à la vérification des entrées de l'utilisateur. Merci d'avance PS : Je me demande s'il n'y a pas une exception qui puisse contourner cette vérification.
captain_torche Posté 16 Octobre 2006 Posté 16 Octobre 2006 Le meilleur moyen de le vérifier, ça reste toujours l'expérimentation : <?php$tab_vars = array(0, '0', 15, '15', 'test', '', null, false, true);foreach($tab_vars as $var) { echo $var.' : '; if($var >= 0 && $var <= 30 && is_numeric($var)) echo 'oui'; else echo 'non'; echo '<br>';}?> On se rend compte qu'en précisant le is_numeric, il ne nous accepte que les 4 premières entrées (ce qu'on cherche), alors qu'avec if($var >= '0' && $var <= '30') les booléens sont acceptés par la boucle. Sinon, petite question au passage : j'ai essayé de le faire avec des opérateurs de comparaison triples (<<= et >>=), mais il ne me ressortait pas les résultats escomptés. Par exemple, avec la comparaison if($var >>=0 && $var <<= 30) , le zéro était refusé, les deux formes du 15 étaient acceptées (forme numérique et chaîne de caractères), ainsi que le booléen true (le false est refusé). Quelqu'un peut il m'expliquer ce comportement ?
MS-DOS_1991 Posté 16 Octobre 2006 Posté 16 Octobre 2006 Sinon, petite question au passage : j'ai essayé de le faire avec des opérateurs de comparaison triples (<<= et >>=), mais il ne me ressortait pas les résultats escomptés.Par exemple, avec la comparaison Qu'est-ce que c'est que ça ? Jamais entendu parler avant et Google ne me donne pas de résultats francs
captain_torche Posté 16 Octobre 2006 Posté 16 Octobre 2006 Un opérateur simple ($x = y) va affecter la valeur y à la variable $x. Dans une condition, un opérateur double (x == y) vaudra true si la valeur de y est comparable à celle de x. Par exemple, si y vaut 1 (entier), et si x vaut '1' (string), la comparaison sera vraie. Pour finir, une comparaison avec un opérateur triple (x === y) retournera true si x a la même valeur ET le même type que y. if(1 === 1) => true if(1 === '1') => false if(1 === true) => false
MS-DOS_1991 Posté 16 Octobre 2006 Posté 16 Octobre 2006 Ah d'accord, merci Je ne connaissais que l'égalité triple ( === ) qui effectivement compare valeur et type
Dan Posté 16 Octobre 2006 Posté 16 Octobre 2006 Sauf qu'à mon humble avis >>= et <<= ne sont pas des opérateurs de comparaison... mais des opérateurs d'assignement. Ce sont des opérateurs "bitwise" (faisant du bit-shifting) ... Ce code démontre que ce sont bien des opérateurs de bit-shifting. $a=2;$a<<=4;print $a; $a<<=4 équivaut à $a = ($a << 4) Cela imprime bien 32, c'est à dire 2 shifté à gauche de 4 bits 00000010 devient donc 00010000 soit 32 !
captain_torche Posté 16 Octobre 2006 Posté 16 Octobre 2006 Woops, au temps pour moi [Edit] Il n'existe donc pas des opérateurs de comparaison triple, qui vérifieraient la valeur numérique et le type ?
froidure_nicolas Posté 17 Octobre 2006 Posté 17 Octobre 2006 (modifié) Par contre, utilises plutôt ceci : <?if(is_numeric($var) && $var >= "0" && $var <= "30"){echo 'La variable $var est un nombre';}?> Question d'économie de ressource Modifié 17 Octobre 2006 par froidure_nicolas
xpatval Posté 17 Octobre 2006 Posté 17 Octobre 2006 Woops, au temps pour moi [Edit] Il n'existe donc pas des opérateurs de comparaison triple, qui vérifieraient la valeur numérique et le type ? Apparemment pas, hormis le cas où $a et $b sont de même valeur et de même type, et que l'on souhaite s'en assurer: if ($a === $b) echo ok; C'est le seul exemple (à ma connaisance) de comparaison triple. xpatval
John_attend Posté 18 Octobre 2006 Auteur Posté 18 Octobre 2006 Ok, merci de vos réponses, même si ça dérive un peu sur la fin J'aimerais quand même que vous me confirmer quelque chose, je vais faire simple et vous allez comprendre pourquoi je posais la question, voici un morceau de script : <?php// On vérifie que l'entrée de l'utilisateur se situe bien aux bornes souhaitéesif($_GET[numero] >= "0" && $_GET[numero] <= "30"){$requetesql = 'UPDATE table SET numero=''.$_GET[numero].'' WHERE num="5"';// Ensuite on execute la requête SQL, peu importe comment}else{echo 'Erreur !';}?> Vous comprenez peut être mieux maintenant le but de ma question. Y a t'il ici un risque de SQL Injection avec la variable numero ? Je préfère être sûr... Merci
froidure_nicolas Posté 18 Octobre 2006 Posté 18 Octobre 2006 A mon avis, il y a un risque, mais limité. De toute manière, ta petite vérification ne mange pas de pain et autant la mettre.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant