Cela fait tout le dimanche que je cherche sans parvenir à trouver de solution car pas assez compétent je pense, je me tourne donc vers qqun de compétent en dernier recours, est-ce qu'il y aurait une bonne âme pour m'aider SVP?
Voici mon problème:
Lorsque les données provenant d'un formulaire contiennent le symbole ['] (apostrophe), l'enregistrement dans ma base de données remplace le symbole ['] par ['].
- En développant mon site en local le problème ne se présente pas et je peux tout à fait enregister des données contenant le symbole ['].
- J'ai constaté que la norme d'interclassement avait été modifiée sur ma bdd on line, passé de utf-8 à utf8mb4.
- J'ai constaté que la norme d'interclassement n'avait pas été modifiée dans ma bdd locale, restée en utf-8.
- J'ai essayé de changer le charset de ma page qui envoi le formulaire en y mettant charset=utf8mb4 ou utf8mb3 également essayé, sans succès.
- L'insertion dans ma bdd est faite à l'aide d'une requête préparée, la voici ci dessous:
J'imagine que tu fais LA chose à ne pas faire : appliquer un htmlspecialchars à tes données avant l'insertion ?
Et pour expliquer la différence de comportement entre les 2 environnements c'est que tu ne dois tout simplement pas utiliser la même version de PHP (détail qui aurait été utile) puisque htmlspecialchars "n'échappait" pas l'apostrophe par défaut avant PHP 8.1.0 (le "mode" - valeur par défaut de son deuxième paramètre - est passé de ENT_COMPAT à ENT_QUOTES) (ie en dév : PHP < 8.1.0, en prod : PHP >= 8.1.0)
> ENT_COMPAT Convertit les guillemets doubles, et ignore les guillemets simples.
> ENT_QUOTES Convertit les guillemets doubles et les guillemets simples.
Pour clarifier, la solution n'est pas de spécifier ENT_COMPAT en second paramètre de tes htmlspecialchars actuels mais d'employer correctement htmlspecialchars en le déplaçant sur tes echo et assimilés (il n'a rien à faire ailleurs).
PS : possible de déplacer le sujet vers le forum PHP puisque MySQL est tout sauf coupable ?
En soit ce n'est pas vraiment un souci, ça encode l'apostrophe dans sa représentation html; si tu utilises les données dans une page HTML, ça devrait décoder automatiquement en apostrophe.
On galère depuis des décennies à faire comprendre la différence entre XSS et injections SQL donc minimisons le problème de fond histoire de bien faire perdurer la confusion. Si personne ne lui dit que ce n'est pas correct comment veux-tu qu'il en ait conscience ? (lui et tous ceux qui pourraient lire ce sujet)
Il n'y a pas mort d'homme, certes, mais ça n'en est pas correct (et le niveau de sécurité n'est pas forcément le même puisque ce qui n'aura pas déjà transité par sa bdd + htmlspecialchars est susceptible de présenter une XSS)
> si tu utilises les données dans une page HTML
Génial le boulot inutile (htmlspecialchars_decode) dès que tu veux générer autre chose que du HTML ...
Je te remercie pour ton aide très précieuse et également pour ta compréhension, je ne suis effectivement pas développeur et certaines bases m'échappent malheureusement.
J'ai essayé en vitesse pendant ma pause, voici le résultat:
- En retirant les htmlspecialchars avant l'insertion en bdd ça fonctionne et les ['] s'enregistrent maintenant correctement.
- En dev j'utilise un PHP 7 et en prod un PHP 8.
En résumé tu as vu TOUT juste, MERCI BEAUCOUP ENCORE POUR TON AIDE.
A partir de maintenant je ne placerai plus jamais de htmlspecialchars avant insertion en bdd mais uniquement lorsque j'affiche les données qui proviennent de ma bdd et ça grâce à toi ! Merci mille fois
Je vais essayer de déplacer le sujet vers le forum PHP.
> A partir de maintenant je ne placerai plus jamais de htmlspecialchars avant insertion en bdd mais uniquement lorsque j'affiche les données qui proviennent de ma bdd et ça grâce à toi !
Voilà au détail près que sauf exceptions clairement identifiées, il faut un htmlspecialchars sur ce que tu renvoies (affiches) dynamiquement au client (echo, <?=, print, etc), que ça sorte de ta base de données ou non (un fichier texte/XML, le résultat d'une API ou peu importe).
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli