Version complète: sur le forum Webmaster Hub : Question de sécurité
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
John_attend
Bonjour à tous,

Voici quelques lignes de code :

CODE
<?

if($var >= "0" && $var <= "30")
{
echo 'La variable $var est un nombre';
}

?>


Est ce que ces lignes équivalent EXACTEMENT à ces lignes :

CODE
<?

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 smile.gif

PS : Je me demande s'il n'y a pas une exception qui puisse contourner cette vérification.
captain_torche
Le meilleur moyen de le vérifier, ça reste toujours l'expérimentation :
CODE
<?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
CODE
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
CODE
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
CITATION(captain_torche @ lundi 16 octobre 2006, 13h58) *
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 ? :o

Jamais entendu parler avant et Google ne me donne pas de résultats francs blush.gif
captain_torche
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
Ah d'accord, merci smile.gif

Je ne connaissais que l'égalité triple ( === ) qui effectivement compare valeur et type happy.gif
Dan
Sauf qu'à mon humble avis >>= et <<= ne sont pas des opérateurs de comparaison... mais des opérateurs d'assignement. whistling.gif

Ce sont des opérateurs "bitwise" (faisant du bit-shifting) ...

Ce code démontre que ce sont bien des opérateurs de bit-shifting.
CODE
$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 wink.gif
00000010 devient donc 00010000 soit 32 !
captain_torche
Woops, au temps pour moi blushing.gif

[Edit] Il n'existe donc pas des opérateurs de comparaison triple, qui vérifieraient la valeur numérique et le type ?
froidure_nicolas
Par contre, utilises plutôt ceci :

CODE
<?
if(is_numeric($var) && $var >= "0" && $var <= "30")
{
echo 'La variable $var est un nombre';
}
?>


Question d'économie de ressource wink.gif
xpatval
CITATION(captain_torche @ lundi 16 octobre 2006, 21h09) *
Woops, au temps pour moi blushing.gif

[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:
CODE
if ($a === $b) echo ok;

C'est le seul exemple (à ma connaisance) de comparaison triple.

xpatval
dièse
et
CODE
!==

wink.gif
John_attend
Ok, merci de vos réponses, même si ça dérive un peu sur la fin hypocrite.gif

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 :

CODE
<?php

// On vérifie que l'entrée de l'utilisateur se situe bien aux bornes souhaitées

if($_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 smile.gif
froidure_nicolas
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.
John_attend
Merci smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.