2016-10-18 31 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());