Aller au contenu

Question de sécurité


John_attend

Sujets conseillés

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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:

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Sauf qu'à mon humble avis >>= et <<= ne sont pas des opérateurs de comparaison... mais des opérateurs d'assignement. :whistling:

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 !

Lien vers le commentaire
Partager sur d’autres sites

Woops, au temps pour moi :blushing:

[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

Lien vers le commentaire
Partager sur d’autres sites

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

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é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 :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...