2016-10-18 32 views
0

我在嘗試構建一個web應用程序,它可以將文件上傳到我的服務器,並獲取稍後下載的鏈接。上傳到服務器的文件存在安全漏洞 - java ee - tomcat

我使兩個吊環分辯與下面的代碼:

String subirArchivo(int codigo, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
    Part filePart = request.getPart("archivo"); // Obtiene el archivo 
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix. 

    //InputStream fileContent = filePart.getInputStream(); //Lo transforma en InputStream 

    String path="/archivos/"; 
    File uploads = new File(path); //Carpeta donde se guardan los archivos 
    uploads.mkdirs(); //Crea los directorios necesarios 
    File file = File.createTempFile("cod"+codigo+"-", "-"+fileName, uploads); //Evita que hayan dos archivos con el mismo nombre 

    try (InputStream input = filePart.getInputStream()){ 
     Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING); 
    } 

    return file.getPath(); 
} 

當文件被上傳到C:\ archivos,我不得不添加

<Context docBase="C:\archivos" path="/archivos" /> 

內的server.xml從Tomcat配置。

問題是用戶可以上傳文件並且執行它。例如,如果他上傳.jsp文件,當用戶調用它時,由服務器執行

我的問題是。如何解決?

+0

您不得添加'C:\ ar chivos'作爲上下文。相反,添加一個只從文件系統中複製文件的servlet,從例如映射*本身*。 'http:// yourserver/archivos/aaa/bbb.pdf'到'C:\ archivos \ aaa \ bbb.pdf'。搜索* java文件servlet *將提供許多解決方案。 –

回答

0

Thans到尼科斯 - PARASKEVOPOULOS,我發現如何上傳和下載我的文件中分辯道:

上傳:

String subirArchivo(int codigo, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
    Part filePart = request.getPart("archivo"); // Obtiene el archivo 
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix. 

    if(!fileName.isEmpty()){ 
     String path="/archivos/"; 
     File uploads = new File(path); //Carpeta donde se guardan los archivos 
     uploads.mkdirs(); //Crea los directorios necesarios 
     File file = File.createTempFile("cod"+codigo+"-", "-"+fileName, uploads); //Evita que hayan dos archivos con el mismo nombre 

     try (InputStream input = filePart.getInputStream()){ 
      Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING); 
     } 

     return file.getPath(); 
    } 
    return null; 
} 

帖子鏈接:

if(adjunto!=null){ 
       String filename=adjunto.substring(10); //La longitud de /archivos/ 
       String borrar="<a href=borrarServlet?codigo="+codigo+"&comentario="+idComentario+"&file="+filename+"><img width=\"16\" src=images/borrar.png></img></a>"; 
       comentarios+="<tr><td>"+fecha+"</td>"+"<td>"+texto+"<br><a class=\"adj\" href=."+adjunto+">Descargar archivo</a></td><td>"+borrar+"</td></tr>"; 
      } 

下載:

String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8"); 
File file = new File("/archivos", filename); 
response.setHeader("Content-Type", getServletContext().getMimeType(filename)); 
response.setHeader("Content-Length", String.valueOf(file.length())); 
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); 
Files.copy(file.toPath(), response.getOutputStream());