J'ai une liste déroulante sur une page Web qui se casse lorsque la chaîne de valeur contient un devis.
La valeur est "asd
, mais dans le DOM, elle apparaît toujours comme une chaîne vide.
J'ai essayé de toutes les manières possibles d'échapper correctement à la chaîne, mais en vain.
<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value=""asd">test</option>
<option value=""asd">test</option>
Comment puis-je afficher cela sur la page pour que le message de publication contienne la valeur correcte?
htmlentities
.Réponses:
"
est la bonne façon, le troisième de vos tests:Vous pouvez voir cela fonctionner ci-dessous, ou sur jsFiddle .
Vous pouvez également délimiter la valeur d'attribut avec des guillemets simples:
la source
"
correspond au même caractère que"
, mais il n'y a aucun avantage à utiliser l'option numérique ici car"
c'est une entité nommée définie."
est également plus facile à retenir.&quot;a
(remplacez le&
par&
)Si vous utilisez PHP, essayez d'appeler
htmlentities
ou dehtmlspecialchars
fonction.la source
<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />
- assurez-vous de les utiliser avec ENT_QUOTES, c'est sûr:,<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' />
mais en plus de ENT_QUOTES, vous devez également ajouter ENT_SUBSTITUTE et ENT_DISALLOWED, personnellement, j'utilise ce wrapper depuis des années:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
Selon la syntaxe HTML et même HTML5 , les options suivantes sont toutes valides:
Notez que si vous utilisez la syntaxe XML, les guillemets (simples ou doubles) sont obligatoires.
Voici un jsfiddle montrant tout ce qui précède .
la source
Une autre option consiste à remplacer les guillemets doubles par des guillemets simples si cela ne vous dérange pas. Mais je ne mentionne pas celui-ci:
Je mentionne celui-ci:
Dans mon cas, j'ai utilisé cette solution.
la source
Si vous utilisez Javascript et Lodash, vous pouvez utiliser _.escape (), qui échappe ",", <,> et &.
Voir ici: https://lodash.com/docs/#escape
la source
Vous ne devez vraiment autoriser que les données non fiables dans une liste blanche de bons attributs comme: align, alink, alt, bgcolor, border, cellpadding, cellspacing, class, color, cols, colspan, coords, dir, face, height, hspace, ismap, lang , marginheight, marginwidth, multiple, nohref, noresize, noshade, nowrap, ref, rel, rev, rows, rowspan, scrolling, shape, span, summary, tabindex, title, usemap, valign, value, vlink, vspace, width
Vous voulez vraiment garder les données non fiables hors des gestionnaires javascript ainsi que des attributs id ou name (ils peuvent encombrer d'autres éléments dans le DOM).
De plus, si vous placez des données non fiables dans un attribut SRC ou HREF, il s'agit vraiment d'une URL non fiable, vous devez donc valider l'URL, assurez-vous que ce n'est PAS une URL javascript:, puis un codage d'entité HTML.
Plus de détails sur tout cela ici: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet
la source
Il n'y a aucun moyen d'échapper les guillemets dans la valeur d'un texte d'entrée ... mais vous pouvez utiliser javascript (ou jquery):
la source