dimanche 6 juin 2010

Une bonne raison d'utiliser intval()

Me frappez pas. J'ai lâché l'idée de reverser winpcap car au final tout tourne autour d'un driver fait par eux-mêmes. Peut-être que quand j'aurai retrouvé l'envie, je m'y mettrai. Mais là, j'ai la tête à parler de PHP car ça faisait longtemps.

Sur le blog de mon camarade pp^, on peut voir un article fort intéressant sur le contournement de la fonction in_array(). Je ne vais pas m'attarder là-dessus, je vous redirige juste sur son article : http://ppisho.me/hack-web/in_array-probleme-avec-des-nombres/.

J'ai aussi trouvé un problème avec des nombres, hors de la fonction in_array(). M'enfin, c'était pas dur à trouver non plus.

Supposons que vous ayez des droits d'écriture sur $foo :


$foo = 3;
if($foo >= 2) {
echo "Rulez!";
} else {
echo "No...";
}


Évidemment, le code affiche Rulez. Seulement voilà, vous vous en douterez :


$foo = " 3 foobar";
if($foo >= 2) {
echo "Rulez!";
} else {
echo "No...";
}


Ce code affiche aussi "Rulez"... Et pour cause ! PHP, c'est bien, mais c'est pas un langage fortement typé comme le C ou le Java. Tout est chaînes de caractères, en PHP. Imaginez qu'à la place de "foobar" après notre "3", on injecte du code SQL, Javascript, ... Et j'en passe. Bah ça fait bobo. Notez aussi que j'ai mis un espace avant le 3 ; pourvu que ça soit un caractère blanc, donc tabulation, retour à la ligne, etc, en fait.

Bon, ok, c'est pas une découverte révolutionnaire et tout le monde sait comment éviter ça.

Avec intval(), notre variable aura toujours un nombre entier mais la condition sera quand même vérifiée :

$foo = intval(" 3 foobar");
if($foo >= 2) {
echo "Rulez! (\$foo = ".$foo.")\n";
} else {
echo ":(";
}


Résultat :

Rulez! ($foo = 3)


Ca sera tout.

Geo

Aucun commentaire:

Enregistrer un commentaire