web-dev-qa-db-fra.com

Comment échapper aux guillemets doubles dans la fonction JSTL / EL?

J'ai besoin de changer " à \" avec remplacement JSTL fonction pour utiliser la chaîne dans la balise d'entrée comme:

<input type="hidden" name="text" size="40" value="${text}">

Si la ${text} a la ", le HTML sera cassé.

J'ai donc essayé

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">

et

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">

mais n'a pas fonctionné. La page fait des erreurs comme

org.Apache.el.parser.ParseException: rencontré ""} ""} "" à la ligne 1, colonne 32. Attendait l'un de: "." ... ")" ... "[" ... "," ... ">" ... "gt" ... "<" ... "lt" ... "> =". .. "ge" ... "<=" ... "le" ... "==" ... "eq" ... "! =" ... "ne" ... "&&" ... "et" ... "||" ... "ou" ... "*" ... "+" ... "-" ... "/" ... "div" ... "%" ... "mod" .. .

Comment puis-je faire ceci?

Mise à jour

J'ai raté une parenthèse étroite de la fonction de remplacement. Le bon était celui-ci avec une parenthèse étroite:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">

Update2

J'ai découvert que lors de la publication de textes, en utilisant \ n'est pas une bonne idée pour cette raison pourquoi ne pas utiliser\"dans la balise d'entrée HTML? . Le code devrait être comme ceci:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '&quot;')}">
19
Sanghyun Lee

Cela ne fonctionne pas car le \ Est un caractère d'échappement dans la chaîne Java. Pour le représenter littéralement, vous devez l'échapper à nouveau avec un autre \. Le " Est également un caractère spécial dans EL, vous devez également l'échapper pour le représenter littéralement. Ainsi, la syntaxe appropriée aurait été:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">

Mais, vous devriez en fait utiliser fn:escapeXml() pour empêcher XSS. Il échappe non seulement aux guillemets, mais aussi aux autres personnages.

<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">

Voir également:

22
BalusC

Vous vous trompez (avec fn: replace ).

La bonne façon est:

<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)

Modifier: Après réflexion,

  • le chemin en utilisant fn: escapeXml (comme écrit par BalusC) fonctionne aussi et semble plus agréable (pas de balises imbriquées)
  • en utilisant fn: replace pour imiter fn: escapeXml demande des problèmes. Vous allez oublier d'inclure un caractère qui devrait être échappé. Il suffit d'utiliser l'existant, testé et testé fn: escapeXml (ou c: out )
5
David Balažic

Vous pouvez avoir une faute de frappe: je ne vois pas de paren de fermeture là-dedans. Essaye ça:

${fn:replace(news.title, "\"", "\\\"")}

De plus, essayez-vous de SORTIR les résultats ou essayez-vous de mettre à jour news.title donc la prochaine fois que vous accéderez à news.title le remplacement est en place? Cela fonctionnera pour sortir le résultat, mais pas pour remplacer la valeur réelle: news.title ne sera pas modifié par cet appel.

4
Femi