这是与http://michael-coates.blogspot.com/2010/09/danger-of-jsp-includes-and-parameter.html
相关的问题TLDR:对于那些不熟悉问题的人,如果您决定使用jsp:include和jsp:param通过父视图传入的params渲染子视图,并且没有正确命名参数并且您引用参数名称如果不存在,客户端可以使用?name =或?value =(无论参数的名称是什么)加载页面,并从URL覆盖该变量的值,从而控制您在子视图。
在我工作的公司,我们最近经历了与该问题非常相似的事情,除了我们正在定义传递给子视图的参数的值。
经过几个小时的挖掘: 理解问题。 了解我们目前的情况。 理解解决方案。 在尝试在JSP中调试它30分钟后,我意识到不明白为什么......
以下是代码的各个部分:
我们有2个ViewModel:一个SelectorViewModel(用于整个选择器),它返回一个选项卡列表和一个TabViewModel(用于选择器中的特定选项卡),它返回特定选项卡的Name值。在调试之后,displayName在所有情况下都是一个真正的字符串(非空,非空)。
return new SimpleViewModel(VIEW_NAME, new SelectorViewModel() {
@Override
public List<TabViewModel> getListOfTabs() {
return tabViewModels;
}
...
}
TabViewModels.add(new TabViewModel() {
@Override
public String getName() {
return tab.getDisplayName();
}
...
}
我们使用JSP中的值并将其传递给子视图。 (Selector.jsp)
<c:forEach items="${component.listOfTabs}" var="tab" >
<jsp:include page="Tab.jsp">
<jsp:param name="name" value="${tab.name}"/>
</jsp:include>
...
在Subview(Tab.jsp)中,我们只渲染param:
<a:text cssClass="tab-text">${param.name}</a:text>
我想不出为什么我们仍然受到上述安全漏洞的影响,但当我们的客户访问我们的生产网站时,有人分享了一个链接:?name = blah&amp; imageUrl = ... and it使用URL中指定的名称和图像内容替换选择器上的每个选项卡。
我们的一位高级工程师被指派处理这个问题但无法解释为什么会发生这种情况,但他通过使用include标签(而不是JSP:include)传递参数并使用页面范围将变量传递给子视图来修复它,所以现在问题不再发生在生产中。
这是最好的解决方法吗?为什么会这样?我觉得有一个更深层次的问题或我们不完全理解的事情。
为任何有帮助的人提供Upvote和AC:)