如何在JSTL函数/ EL中转义双引号?

2022-09-01 23:02:13

我需要更改为使用JSTL替换函数才能在输入标记中使用字符串,例如:"\"

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

如果 具有 ,则 HTML 将被破坏。${text}"

所以我试过了

<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” ..."%" ...“模组” ...

我该怎么做?

更新

我错过了替换功能的紧密部分。右边的那个是这个有一个接近的paren:

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

更新2

我发现在发布文本时,使用不是一个好主意,因为这个原因为什么不能在HTML输入标签中使用\”。代码应如下所示:\

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

答案 1

它不起作用,因为它是 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)}">

###See还:


答案 2

你做错了(使用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 是自找麻烦。您将忘记包含一些应该转义的字符。只需使用现有的,经过尝试和测试的fn:escapeXml(或c:out)

推荐