c:out嵌套的内部元素属性

时间:2011-10-14 18:28:25

标签: java jsp jstl

在元素属性中嵌套一个c:out JSTL标记是一个好习惯还是使用c:out的var属性通常是首选的?它似乎在任何一种方式下工作,但我怀疑嵌套它可能在某些应用程序服务器或JSP版本中不起作用(它只是看起来错误)。

例如,一个输入元素,其值在验证失败时恢复,并且具有特殊字符转义:

<input type="text" name="firstname" value="<c:out value="${param.firstname}"/>"/>

<c:out value="${param.firstname}" var="firstname"/>
<input type="text" name="firstname" value="${firstname}"/>

2 个答案:

答案 0 :(得分:15)

在不干扰嵌套<c:out>标记的格式良好的XML语法的情况下,防止HTML元素属性中的XSS攻击的常见做法是使用fn:escapeXml()函数:

<input type="text" name="firstname" value="${fn:escapeXml(param.firstname)}"/>

答案 1 :(得分:0)

我经常在任何地方使用${}。它简单易读。当我需要额外的功能时,我会使用<c:out>,例如escapeXml函数。

在您的示例中,您实际上可以通过 <c:out>逃脱:

<input type="text" name="firstname" value="${param.firstname}"/>

编辑:XSS问题

我的回答并没有解决BalusC和StuartWakefield提到的XSS漏洞。虽然我的答案简单正确,但你应该总是缓解XSS漏洞。我更喜欢使用OWASP taglib

<span>${esc:forHtml(sketchyText)}</span>
<span><esc:forHtml(sketchyText)/></span>
<input value="${esc:forHtmlAttribute(sketchyText)}"/>