創建 時org.apache.catalina.Context,您需要指定一個“docBase”引數。docBase 應該是一個現有的目錄。如果它不是現有的、可訪問的目錄,則背景關系創建將失敗。
java 檔案將此引數描述為“背景關系的基本目錄,用于靜態檔案。必須存在,相對于服務器主目錄”。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();
}
}
}
uj5u.com熱心網友回復:
在傳統部署中,docBase指向 WAR 檔案的根目錄或包含擴展 WAR 檔案的目錄。它是ServletContext#getResource決議呼叫所依據的基本 URL ,也是DefaultServlet.
在您的情況下, usingnew File(".").getAbsoluteFile()確實允許攻擊者檢索所有檔案,假設他們可以猜出它們的名稱并且該請求沒有被您的一個 servlet 攔截。它不會發生,因為您呼叫了Tomcat#addContext而不是Tomcat#addWebapp,這會阻止 Tomcat 將默認值web.xml應用于您的應用程式(即 no DefaultServlet)。
但是,更安全的選擇是使用nullas docBase。在現代 Tomcat 上,這將導致創建一個空的記憶體資源集(參見源代碼)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/381055.html
上一篇:如何在多張紙上使用專案
