创建 时org.apache.catalina.Context
,您需要指定“docBase”参数。docBase 应该是一个现有目录。如果它不是现有的、可访问的目录,则上下文创建失败。
java doc将此参数描述为“上下文的基本目录,用于静态文件。必须存在,相对于服务器主目录”。Tomcat 对那个目录做了什么?它可能会从该位置提供文件吗?如果我不想提供静态文件,该参数的最安全值是多少?
例如,在我可以编写的最简单的嵌入式 Tomcat 服务器中,File(".").getAbsolutePath()
恶意客户端是否有可能使用该参数从当前目录中检索文件?
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
/**
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.56</version>
</dependency>
*/
public class OneServlet {
public static void main(String[] args) {
Tomcat tomcat = new Tomcat();
tomcat.setPort(9000);
tomcat.getConnector();
var context = tomcat.addContext("", new File(".").getAbsolutePath());
Tomcat.addServlet(context, "servlet", new HttpServlet() {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello world");
}
});
context.addServletMappingDecoded("/", "servlet");
try {
tomcat.start();
tomcat.getServer().await();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}