Échappement des guillemets dans une valeur pour une forme collante en PHP
-
07-07-2019 - |
Question
J'ai un peu de difficulté à créer un formulaire collant qui mémorisera ce qui y est entré lors de la soumission du formulaire si la valeur est entre guillemets. Le problème est que le HTML est supposé lire quelque chose comme:
<input type="text" name="something" value="Whatever value you entered" />
Cependant, si la phrase: & "Comment puis-je faire cela? &"; est saisi avec des guillemets, le code HTML résultant est similaire à:
<input type="text" this?="" do="" i="" how="" value="" name="something"/>
Comment devrais-je filtrer les guillemets? Je l'ai essayé avec des guillemets magiques de temps en temps, j'ai utilisé striplashes et addlashes, mais je n'ai pas encore trouvé la bonne solution. Quel est le meilleur moyen de résoudre ce problème en PHP?
La solution
Vous souhaitez htmlentities () .
<input type="text" value="<?php echo htmlentities($myValue); ?>">
Autres conseils
Ce qui précède encodera toutes sortes de caractères ayant un code d’entité HTML. Je préfère utiliser:
htmlspecialchars($myValue, ENT_QUOTES, 'utf-8');
Ceci encodera seulement:
'&' (ampersand) becomes '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
''' (single quote) becomes ''' only when ENT_QUOTES is set.
'<' (less than) becomes '<'
'>' (greater than) becomes '>'
Vous pouvez également faire un strip_tags sur la $ myValue pour supprimer les balises html et php.
C'est ce que j'utilise:
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, 'UTF-8')
-
ENT_QUOTES
dit à PHP de convertir les guillemets simples et doubles, ce que je trouve souhaitable. -
ENT_SUBSTITUTE
etENT_DISALLOWED
traitent les caractères Unicode invalides. Ils sont assez similaires - pour autant que je sache, le premier substitue des séquences d'unités de code invalides, c'est-à-dire des caractères codés de manière non valide ou des séquences ne représentant pas des caractères , tandis que le second substitue des points de code invalides pour le document donné. type, c'est-à-dire les caractères non autorisés pour le type de document spécifié (ou la valeur par défaut si non spécifiée explicitement). La documentation est excessivement laconique à leur sujet. -
ENT_HTML5
est le type de document que j'utilise. Vous pouvez en utiliser un autre, mais il doit correspondre à votre doctype de page. -
UTF-8
est l'encodage de mon document. Je suggère que, sauf si vous êtes absolument sûr que vous utilisez PHP 5.4.0, vous spécifiez explicitement le codage, en particulier si vous utilisez un texte non anglais. Un hôte sur lequel je travaille utilise une version 5.2.quelque chose, dont la valeur par défaut estISO-8859-1
et qui produit du charabia.
Comme thesmart le suggère, htmlspecialchars
ne code que les caractères HTML réservés, tandis que htmlentities
convertit tout ce qui a une représentation HTML. Dans la plupart des contextes, l'un ou l'autre fera l'affaire. Voici une discussion sur le sujet.
Encore une chose: il est préférable de garder les guillemets magiques désactivés, car ils donnent un faux sentiment de sécurité et sont déconseillés dans 5.3.0 et retirés de 5.4.0. S'ils sont activés, chaque citation de vos champs sera précédée d'une barre oblique inverse lors de la publication (et plusieurs publications ajouteront de plus en plus de barres obliques). Je vois que l'OP peut changer le réglage, mais pour les références futures: si vous êtes sur un hôte partagé ou si vous n'avez pas accès à php.ini
, le moyen le plus simple est d'ajouter
php_flag magic_quotes_gpc Off
vers le .htaccess
fichier.