在元素属性中嵌套一个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}"/>
答案 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}"/>
我的回答并没有解决BalusC和StuartWakefield提到的XSS漏洞。虽然我的答案简单正确,但你应该总是缓解XSS漏洞。我更喜欢使用OWASP taglib。
<span>${esc:forHtml(sketchyText)}</span>
<span><esc:forHtml(sketchyText)/></span>
<input value="${esc:forHtmlAttribute(sketchyText)}"/>