Il fut un temps béni ou PHP était intuitif... (les premiers scripts publiés dans ce site datent de cette époque et seront sans doute adaptés petit à petit). Les formulaires et autres cookies et sessions généraient automatiquement des variables au nom de leurs champs, les variables non déclarées précédemment s'auto-déclaraient (ou du moins n'affichaient pas d'erreur)... Bref le Bonheur !
Puis vint le temps des pirates qui, s'attaquant jusque là presqu'exclusivement aux applications Microsoft se sont mis à emm.. le monde libre et il a fallu
sécuriser PHP :s
Un petit exemple pour mieux comprendre :
Le script simplissime suivant :
Bonjour <?echo $nom?> ! <form method=post> <input name="nom"> <input type=submit value="Votre nom"> </form>
|
affiche avant et après validation du formulaire :
EasyPHP <= 1.6
 |
EasyPHP 1.7
 |
 |
 |
Alors pourquoi ? PHP a-t-il tant changé ?...
Déjà, inutile d'aller insulter
Emmanuel Faivre le créateur d'
EasyPHP ou
Romain Bourdon le créateur de
WAMP5 qui nous rendent tant service et suivent scrupuleusement les recommandations du team PHP ! :)
D'ailleurs, lors de l'installation d'EasyPHP 1.7 ou plus, vous avez tous cliqué "Suivant" sur le petit écran d'alerte que Manu a mis sans prendre le temps de le lire, et encore moins de le noter... ;) Pour mémoire le voici :
EasyPHP 1.7
Configuration PHP
§ register_globals = Off [sécurité, performance]
Depuis la version 4.2.0 de PHP, la valeur par défaut de register_global est à Off dans le php.ini. Dorénavant une variable envoyée par un formulaire (méthode POST) n'est plus récupérée avec $variable mais avec $_POST["variable"]. Toutes les variables globales sont concernées (POST, GET, cookies, environnement et autres variables serveur : $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, $_SESSION). Ceci peut nécessiter la réécriture partielle de certains scripts.
Rq : il est vivement conseillé d’utiliser cette configuration qui est celle adoptée par défaut depuis PHP 4.2.0 et de coder vos scripts en conséquence. Cependant si vous souhaitez utiliser d’anciens scripts sans avoir à les réécrire, vous avez toujours la possibilité de remettre dans le fichier php.ini register_global à On.
§ error_reporting = E_ALL [codage propre]
Les erreurs de codage et les avertissements (warning) sont pris en compte. Cette configuration est plus restrictive mais nécessaire pour un codage propre. Il est donc possible que certains scripts génèrent des avertissements qui n'apparaissaient pas auparavant. Dans ce cas, il s'agira essentiellement de notifications. Si ces notifications sont dues à un codage intentionnel vous pouvez les supprimer en remplaçant dans le fichier php.ini la ligne "error_reporting = E_ALL" par "error_reporting = E_ALL & ~E_NOTICE".
|
|
Donc, en suivant ces recommandations,
notre petit script précédent devrait s'écrire :
Bonjour <?echo @$_POST["nom"]?> ! <form method=post> <input name="nom"> <input type=submit value="Votre nom"> </form>
|
Car :
- Le formulaire ne génère plus automatiquement une variable $nom à cause du paramètre register_globals. Il faut donc lui spécifier $_POST["nom"]
- Avant la validation du formulaire... $_POST["nom"] n'est pas définie ! donc une erreur va apparaître à cause du paramètre error_reporting qui demande maintenant l'affichage des NOTICEs... alors pour empêcher ceci ponctuellement, on utilisera le @ qui signifie en gros "t'occupe pas de l'erreur éventuelle générée" ;)