Java代码审计:文件操作与上传

图片[1]-Java代码审计:文件操作与上传-山海云端论坛

1.1. 文件上传

这段代码展示了一个简单的文件上传功能,但存在安全风险。现代的Web框架会将上传的文件存储在Web访问不到的位置,以缓解上传漏洞,但若在展示文件时处理不当,仍可能导致任意文件读取或下载。

<code>private static final String UPLOAD_PATH = "/tmp/upload"; private boolean uploadWithFileUpload(HttpServletRequest request) { if (!ServletFileUpload.isMultipartContent(request)) { //response.getWriter().print("Error: 表单必须包含 enctype=multipart/form-data"); return false; } try { List<FileItem> fileItems = servletFileUpload.parseRequest(request); if (fileItems != null && fileItems.size() > 0) { for (FileItem fileItem : fileItems) { String fileName = new File(fileItem.getName()).getName(); //获取文件名 String filePath = UPLOAD_PATH + File.separator + fileName; //上传路径 File storeFile = new File(filePath); fileItem.write(storeFile); //写文件 } } } catch (Exception e) { //response.getWriter().print(e.getMessage()); return false; } return true; }</code>
图片[2]-Java代码审计:文件操作与上传-山海云端论坛

1.1.1. 防御

  • 判断文件的content-type;
  • 上传文件后改名,使用散列值替换文件名;
  • 设置严格的后缀名白名单;
  • 对文件大小进行限制;
  • 将上传文件存储在Web访问不到的位置。

1.2. 文件操作(下载/读取/删除)

以下代码展示了文件的读取、下载和删除操作:

<code>// 读取 File file = new File(filename); InputStream inputStream = new FileInputStream(file); while (-1 != (len = inputStream.read())) { outputStream.write(len); } // 下载 String filename = request.getParameter("filename"); File file = new File(filename); response.reset(); response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("utf-8"))); response.addHeader("Content-Length", "" + file.length()); response.setContentType("application/octet-stream; charset=utf-8"); InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); int len; while (-1 != (len = inputStream.read())) { outputStream.write(len); } // 删除 String filename = request.getParameter("filename"); File file = new File(filename); if (file != null && file.exists() && file.delete()) { response.getWriter().println("delete success"); } else { response.getWriter().println("delete failed"); }</code>

1.2.1. 防御

防御的核心在于对传入的文件名进行正确的过滤,防止跨目录操作。可以使用严格的文件名白名单、检查文件路径、限制文件大小等方式来加强安全性。

1.3. 文件写入

文件写入操作与读取、下载、删除操作略有不同。在进行文件写入时,需要对写入的内容进行过滤和处理。

<code>// FileWriter FileWriter fileWriter = new FileWriter(filename); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(fileContent); bufferedWriter.close();</code>

1.3.1. 防御

在文件写入操作中,需要对写入的内容进行严格的过滤和验证,以防止恶意内容的注入。可以对写入的内容进行HTML编码,避免注入攻击。

以上是对Java代码审计中文件操作部分的优化与总结。在开发过程中,务必注意文件操作的安全性,以防止各种潜在的安全威胁。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容