Traitement chaines entrées
Bon,
Je sais bien que ce sujet serait mieux dans PHP, mais je pense que le niveau ici sera meilleur. J'ai jamais vraiment eu de réponses à certaines questions, j'ai l'impression que seuls les scripteurs postent sur internet (sans blague).
En général, sur des variables d'entrée de type $_POST, je m'attends à une chaine de caractères écrite à la main (venant d'un formulaire etc), ou du même type. Cette chaine représente un danger potentiel, mais on va dire que chaque utilisateur des chaines d'entrée se doit de gérer ses propres vulnérabilités.
Toutefois, certains dangers sont communs, et l'on peut même définir ce qu'est une chaine UTF8 (par exemple) valide. Ce qui diffère d'une chaine de caractère plutôt de type binaire.
A mon sens, j'aurais donc tendance à :
- Nettoyer la chaine de caractère des caractères de controles non imprimables tel que le caractère nul. Comme je le disais, on n'enlève pas nul parce qu'il est dangereux, mais tout simplement parce qu'il va prendre de la place dans la base de données (par exemple) pour rien, et qu'aucun humain censé penserait à l'insérer dans un texte. Il s'agit donc de le supprimer des variables chaines UTF-8 et laisser à disposition dans une autre variables une copie entière binaire (on sait jamais, on pourrait toujours en avoir besoin).
- Vérifier l'encodage. Oui, je me suis demandé un jour "ca fait quoi de passer du iso à un code utf8". En fait, pas spécialement grand chose. J'avais déjà vu des opérations utf8 sur de l'iso se transformer en catastrophe : une chaine vide était retournée. D'autres on des valeurs fausses (strlen par exemple). Or, d'une part on attend de l'utf8, donc c'est pas valide, et si on l'affiche par la suite, on aura quelque chose d'invalide, d'autre part, on a un problème de sécurité général. Qui peut dire quelle sera la réaction exacte d'une fonction avec une chaine totalement invalide dessus ? Difficile ... Et deuxio, les faux utf-8, composés d'ensembles plus grand qu'ils devraient (exemple un . codé sur deux octets). mb_ propose une extension pour cela, et elle semble fonctionner à la fois pour un ensemble d'octets invalides et aussi pour des caractères plus long que prévus (mais surement pas dans des cas plus fins, à voir).
D'après vous, ce ne serait pas normal de mettre ces deux "nettoyeurs" en entrée ? J'ai l'impression que tout le monde utilise directement les variables, quitte à se contenter d'un nettoyage par liste blanche.
Tchao ;) Je participerai aussi sur les exceptions car je pense sérieusement à écrire ou à reprendre une petite classe pour que toutes les erreurs (même NOTICE) se "transforment" en Exception. La gestion des erreurs en PHP est une abération, et là ce n'est pas une question, c'est une certitude ;)
a+