自 2024 年 10 月 8 日发布 Apache Tomcat servlet 容器 9.0.96 版本以来,c:out 标记的行为有所不同,看起来像是潜在的安全问题(代码注入?)
看起来在某些情况下它不再逃避
value
属性。
版本 9.0.95(及之前的版本)没有此行为。
以下是重现问题的方法。使用一个简单的测试文件(例如,在 ROOT Web 应用程序中将其用作
index.jsp
,以及应用程序的 lib 文件夹中的 taglibs-standard-impl-1.2.5.jar
和 taglibs-standard-spec-1.2.5.jar
):
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String test = "{ \"key\" : \"value\" }";
java.util.Map<String, String> map = new java.util.HashMap<>();
map.put("test", test);
request.setAttribute("test", test);
request.setAttribute("map", map);
%>
<!DOCTYPE html>
<html lang="en">
<body>
<input type="text" name="test" id="test" value="<c:out value="${test}" />" />
<br/>
<input type="text" name="test" id="test" value="<c:out value="<%=test %>" />" />
<br/>
<c:forEach items="${map}" var="entry">
<input id="${entry.key}" name="${entry.key}" type="text" value="<c:out value="${entry.value}" />">
<br/>
</c:forEach>
<br/>
<br/>
Tomcat Version : <%= application.getServerInfo() %>
<br/>
Servlet Specification Version : <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %>
<br/>
JSP version : <%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %>
</body>
</html>
在 Tomcat 9.0.95 中它的渲染如下(仅显示重要部分):
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input id="test" name="test" type="text" value="{ "key" : "value" }">
在 Tomcat 9.0.96 中它的渲染如下:
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input id="test" name="test" type="text" value="{ "key" : "value" }">
更糟糕的是,当刷新页面时(上面的结果只获取一次,JSP编译后),则呈现如下:
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input type="text" name="test" id="test" value="{ "key" : "value" }" />
<input id="test" name="test" type="text" value="{ "key" : "value" }">
经过更广泛的研究,可以在这里找到与所描述的行为没有直接联系的问题:
https://bz.apache.org/bugzilla/show_bug.cgi?id=69399
可能最好避免使用 9.0.96,直到它被修复。