【问题标题】:Protecting against directory traversal防止目录遍历
【发布时间】:2019-04-14 09:44:38
【问题描述】:

这里是新手,在下面的 int 中,它将文件作为参数并将其连接到目录字符串,然后查找文件并使用流获取文件并将其提供给浏览器以供下载。此代码容易受到目录遍历的影响,我不确定如何加强代码以抵消这种情况。

<%
         if(request.getParameter("file")!=null)
        {
            String context = request.getContextPath();

            int BUFSIZE = 4096;
               String filePath;


            filePath = request.getParameter("file");
            File file = new File(getServletContext().getRealPath("/") +context);
            file = new File(file.getParent()+"/documents/"+filePath);       
            int length   = 0;
            ServletOutputStream outStream = response.getOutputStream();
            //response.setContentType("text/html");
            response.setContentLength((int)file.length());
            String fileName = (new File(filePath)).getName();
            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

            //response.setHeader("Content-Disposition", "attachment; filename=\"" +new Random().nextInt(10000)+ "\"");

            byte[] byteBuffer = new byte[BUFSIZE];
            DataInputStream in = new DataInputStream(new FileInputStream(file));

            while ((in != null) && ((length = in.read(byteBuffer)) != -1))
            {
            outStream.write(byteBuffer,0,length);
            }

            in.close();
            outStream.close();
        }
        else
        {

        }

%>

【问题讨论】:

    标签: jsp web-applications url-encoding owasp directory-traversal


    【解决方案1】:

    问题在于使用不受信任的文件名创建 outputFile。 验证文件名将解决您的 PathTraversal。

    修复示例:

    if (validateFileName(request.getParameter("file")));
         filePath = request.getParameter("file");
    else
    // Error 
    
    
    //....
    //.....
    
    boolean validateFilename(String fileName)
          {
                // This represents the format /myapp/temp/<filename>
                String goodPattern = "/myapp/temp/(\\w|\\s|\\.|-|){1,20}";
                File file = new File (fileName);
                Pattern p = Pattern.compile(goodPattern);
                Matcher m = p.matcher(file.getCanonicalPath());
                if (!m.matches())
                {
                      return false;
                }
                return true;
          }
    

    见:

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2015-05-12
      • 2019-10-15
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多