1

因此,我的任务是在基本的 Java Web 应用程序中修复路径遍历问题,但我非常卡住。我们的目的是从本质上确保代码是安全的,同时保持功能(这是我正在努力的部分)

到目前为止,我已经在网上查看了如何解决我收到的问题,并且我设法解决了这些问题,但是测试代码的机器人返回一条消息,指出该应用程序不再具有功能,但是是安全的。

我收到的 2 个错误如下:

1) FileDownload 中的 PATH_TRAVERSAL_IN。java 源文件文件下载。java 类名 chatapp。FileDownload 方法名称 doGet Source Line 31

2) FileDownload 中的 PT_RELATIVE_PATH_TRAVERSAL。java 源文件文件下载。java 类名 chatapp。FileDownload 方法名称 doGet Source Line 28

作为参考,此代码是其功能的原始代码,但它不安全。

    private String DOWNLOAD_PATH = new File(".").getCanonicalPath() + 
     "/webapps/webapp/app/download";

    public FileDownload() throws IOException {
    }

    public void init() throws ServletException {
        //To Do
    }

    public void doGet(HttpServletRequest request,
                       HttpServletResponse response)
            throws ServletException, IOException
    {

     !!!String file = request.getParameter("file");
        String downloadPath = DOWNLOAD_PATH + "/" + file;
     !!!File downloadFile = new File(FilenameUtils.getName(downloadPath));

        if (downloadFile.exists()) {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition", "attachment; filename="+ downloadFile.getName());
            FileInputStream fis = new FileInputStream(downloadFile);
            byte[] data = new byte[(int) downloadFile.length()];
            fis.read(data);
            fis.close();

            OutputStream out = response.getOutputStream();
            out.write(data);
            out.flush();
        }
        else
            response.sendError(404);

    }

有没有人有解决这类问题的经验?我有点困惑

4

1 回答 1

0

维基百科关于路径遍历的文章有一个建议的方法来防止它

  1. 处理不导致文件请求的 URI 请求,例如,在下面继续之前执行用户代码的挂钩。
  2. 当要对文件/目录进行 URI 请求时,构建文件/目录的完整路径(如果存在),并对所有字符进行规范化(例如,%20转换为空格)。
  3. 假定“文档根”完全限定、规范化的路径是已知的,并且该字符串的长度为“N”。假设不能提供此目录之外的文件。
  4. 确保所请求文件的完全限定路径的前“N”个字符与“文档根目录”完全相同。
  5. 如果是这样,请允许返回文件。
  6. 如果不是,则返回错误,因为该请求显然超出了应允许 Web 服务器服务的范围。

因此,您将从 中创建第二个文件对象DOWNLOAD_PATH,然后用于getCanonicalPath 查看要下载的文件的路径是否以下载目录的路径开头。

完成此操作后,您将向@SuppressWarnings该方法添加注释以隐藏现在已正确处理的警告。

于 2019-11-13T07:53:30.927 回答