【问题标题】:c:out nested inside element attributec:out 嵌套在元素属性中
【发布时间】:2011-10-14 18:28:24
【问题描述】:

在元素属性中嵌套 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}"/>

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    我通常在我可以使用的任何地方使用${}。它更简单,更具可读性。我在需要额外功能时使用&lt;c:out&gt;,例如escapeXml 函数。

    在您的示例中,您实际上可以逃脱 no &lt;c:out&gt;:

    <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)}"/>
    

    【讨论】:

    • 这只适用于 JSP 2.0 和更新版本,现在应该没问题,但这只会打开一个广泛的 XSS 攻击漏洞......
    • 这是否记录在某处?我想了解更多关于它的信息,但我无法理解为什么直接在 HTML 属性中使用 ${} 会导致 XSS 攻击...
    • @IcedD​​ante - 如果您在评论中使用“@{username}”,它会向 BalusC 发送通知。否则,他可能会错过您的评论。
    • 我朋友的名字是"/&gt;&lt;script&gt;/*xss here*/&lt;/script&gt;&lt;img src="lolcatz.jpg"... 其他一些安全措施可能会在我们输入之前捕获这种情况,但可以想办法绕过它。在任何情况下,使用上面的代码,名字中的任何错误双引号都会“突破”HTML 属性。您应该为输出它的上下文转义它,即函数escapeHtmlAttribute 是理想的,${fn:escapeXml(person.firstname)} 就足够了。
    • @StuartWakefield - 请告诉我你真的认识一个叫这个名字的人。我以为只有myth。值得庆幸的是,自从发布此答案后,我对 XSS 有了更多了解。
    【解决方案2】:

    在不通过嵌套的&lt;c:out&gt; 标签破坏格式良好的 XML 语法的情况下防止 HTML 元素属性中的 XSS 攻击的常见做法是改用 fn:escapeXml() 函数:

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

    【讨论】:

    • 嗯,似乎没有充分的理由使用 c:out?
    • 不在 HTML 元素属性中,没有。在它之外,这取决于。 &lt;c:out value="${bean.foo}" /&gt; 对一些开发人员来说比${fn:escapeXml(bean.foo)} 更具可读性。或者,您也可以继续使用像 JSF 这样的 MVC 框架,这样您就不必担心这个(以及 servlet 中所有其他重复的样板)。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2012-09-07
    • 2018-03-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多