web-dev-qa-db-ja.com

JSTL関数/ ELで二重引用符をエスケープする方法は?

変更する必要があります"\" with JSTL replace function to the string in input tag in input like:

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

${text}には"、HTMLは壊れます。

だから私は試しました

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

そして

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

うまくいきませんでした。ページは次のようなエラーになります

org.Apache.el.parser.ParseException:1行32列目で ""} ""} ""が発生しました。次のいずれかが予期されていました: "。" ... ")" ... "[" ... "、" ... ">" ... "gt" ... "<" ... "lt" ... "> ="。 .. "ge" ... "<=" ... "le" ... "==" ... "eq" ... "!=" ... "ne" ... "&&" ...「および」...「||」 ... "または" ... "*" ... "+" ... "-" ... "/" ... "div" ... "%" ... "mod" .. 。

これどうやってするの?

更新

Replace関数のかっこがありませんでした。正しいのは、かっこの近いこれです。

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

Update2

テキストを投稿するとき、\は、この理由のために良い考えではありません HTML入力タグで\ "を使用できないのはなぜですか? コードは次のようになります。

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

_\_はJava文字列のエスケープ文字であるため、機能しません。文字列で表すには、もう一度別の_\_でエスケープする必要があります。また、 _"_はELの特殊文字であり、文字どおりに表現するにはエスケープする必要があるため、適切な構文は次のようになります。

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

ただし、実際にはXSSを防ぐためにfn:escapeXml()を使用する必要があります。引用符だけでなく、他の文字もエスケープします。

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

以下も参照してください。

22
BalusC

あなたはそれを間違っています(fn:replaceで)。

正しい方法は次のとおりです。

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

編集:さらに考えると:

  • fn:escapeXmlを使用する方法(BalusCによって記述)も機能し、見栄えがよくなります(ネストされたタグなし)
  • fn:replaceを使用してfn:escapeXmlを模倣すると、問題が発生します。 willエスケープする必要がある文字を含めるのを忘れます。既存の試行済みのfn:escapeXml(またはc:out)を使用するだけです
5
David Balažic

タイプミスがあるかもしれません。そこに閉じ括弧がありません。これを試して:

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

また、結果を出力しようとしているのですか、それともnews.title次回アクセスするときにnews.title交換は適切ですか?これは結果を出力するために機能しますが、実際の値を置き換えるためには機能しません:news.titleはこの呼び出しによって変更されません。

4
Femi