我遇到了安全问题。有人从我网站的输入中输入了这样的值。输入文本如下:
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>
但它看起来很难看。
答案 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>
由于值属性已关闭,浏览器将发送选项标记的内容。