JSTL表格标签EL注塑

时间:2015-04-13 15:33:48

标签: java spring security jstl el

我遇到了安全问题。有人从我网站的输入中输入了这样的值。输入文本如下:

ADMIN{${sleep(20)}}

我有一个表单可以在我的页面中选择并显示这些值。但是,这个值打破了我的页面。这是我的JSP代码:

<form:select path="roleName" class="form-control">
    <form:option value=""></form:option>
    <c:forEach items="${roleList}" var="role">
        <form:option value="${role.name}"><c:out value="${role.name}" /></form:option>
    </c:forEach>
</form:select>

c:out标记按预期工作,但form:option标记不起作用,它会抛出以下异常:

javax.servlet.jsp.el.ELException: no method corresponding to the one declared in the EL was found  method : 'sleep'
  at weblogic.jsp.internal.jsp.el.FunctionEvaluator.evaluate(FunctionEvaluator.java:65)
  at weblogic.jsp.internal.jsp.el.ELNode$Function.evaluate(ELNode.java:702)
  at weblogic.jsp.internal.jsp.el.ExpressionEvaluatorImpl$ELExpression.evaluate(ExpressionEvaluatorImpl.java:188)
  at weblogic.jsp.internal.jsp.el.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:126)
  at org.springframework.web.util.ExpressionEvaluationUtils.evaluateExpression(ExpressionEvaluationUtils.java:231)
  at org.springframework.web.util.ExpressionEvaluationUtils.doEvaluate(ExpressionEvaluationUtils.java:206)
  at org.springframework.web.util.ExpressionEvaluationUtils.evaluate(ExpressionEvaluationUtils.java:94)
  at org.springframework.web.servlet.tags.form.AbstractFormTag.evaluate(AbstractFormTag.java:50)
  at org.springframework.web.servlet.tags.form.OptionTag.resolveValue(OptionTag.java:247)
  at org.springframework.web.servlet.tags.form.OptionTag.exposeAttributes(OptionTag.java:174)
  at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:48)
  at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
  at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
  at jsp_servlet._web_45_inf._jsp._user.__listuser._jspService(__listuser.java:968)

如何使form:option工作以显示这个奇怪的值?我不希望用户输入那些奇怪的价值观。我希望能够显示他们输入的内容。

编辑:

我能找到的唯一可行解决方案是:

<form:select path="roleName" class="form-control">
    <form:option value=""></form:option>
    <c:forEach items="${roleList}" var="role">
        <option value="${fn:escapeXml(role.adi)}" ${role.adi == userSearchForm.roleName ? 'selected="selected"' : ''}>
            <c:out value="${role.adi}" />
        </option>
    </c:forEach>
</form:select>

但它看起来很难看。

3 个答案:

答案 0 :(得分:0)

我认为您可以通过转义价值来解决您的问题。 例如:

<form:option value="${fn:escapeXml(role.name)}"><c:out value="${fn:escapeXml(role.name)}" />

答案 1 :(得分:0)

您也可以先尝试使用c:set tag创建变量,然后在'value'属性中使用它。

<c:set var="roleName"><c:out value="${role.name}" /></c:set>
<form:option value="${roleName}">${roleName}</form:option>

答案 2 :(得分:0)

由于你的c:out按预期工作,因此一种方法是使用HTML版本的OPTION标记并保留<​​em> value 属性...所以将其更改为:

<c:forEach items="${roleList}" var="role">
    <option><c:out value="${role.name}" /><option>
</c:forEach>

由于属性已关闭,浏览器将发送选项标记的内容