阻止任意文件下载漏洞
This commit is contained in:
		| @@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PostMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| @@ -41,17 +42,15 @@ public class CommonController | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (!FileUtils.isValidFilename(fileName)) | ||||
|             if (!FileUtils.checkAllowDownload(fileName)) | ||||
|             { | ||||
|                 throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); | ||||
|             } | ||||
|             String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); | ||||
|             String filePath = RuoYiConfig.getDownloadPath() + fileName; | ||||
|  | ||||
|             response.setCharacterEncoding("utf-8"); | ||||
|             response.setContentType("multipart/form-data"); | ||||
|             response.setHeader("Content-Disposition", | ||||
|                     "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName)); | ||||
|             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); | ||||
|             FileUtils.setAttachmentResponseHeader(response, realFileName); | ||||
|             FileUtils.writeBytes(filePath, response.getOutputStream()); | ||||
|             if (delete) | ||||
|             { | ||||
| @@ -92,18 +91,28 @@ public class CommonController | ||||
|      * 本地资源通用下载 | ||||
|      */ | ||||
|     @GetMapping("/common/download/resource") | ||||
|     public void resourceDownload(String name, HttpServletRequest request, HttpServletResponse response) throws Exception | ||||
|     public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) | ||||
|             throws Exception | ||||
|     { | ||||
|         // 本地资源路径 | ||||
|         String localPath = RuoYiConfig.getProfile(); | ||||
|         // 数据库资源地址 | ||||
|         String downloadPath = localPath + StringUtils.substringAfter(name, Constants.RESOURCE_PREFIX); | ||||
|         // 下载名称 | ||||
|         String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); | ||||
|         response.setCharacterEncoding("utf-8"); | ||||
|         response.setContentType("multipart/form-data"); | ||||
|         response.setHeader("Content-Disposition", | ||||
|                 "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName)); | ||||
|         FileUtils.writeBytes(downloadPath, response.getOutputStream()); | ||||
|         try | ||||
|         { | ||||
|             if (!FileUtils.checkAllowDownload(resource)) | ||||
|             { | ||||
|                 throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); | ||||
|             } | ||||
|             // 本地资源路径 | ||||
|             String localPath = RuoYiConfig.getProfile(); | ||||
|             // 数据库资源地址 | ||||
|             String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); | ||||
|             // 下载名称 | ||||
|             String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); | ||||
|             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); | ||||
|             FileUtils.setAttachmentResponseHeader(response, downloadName); | ||||
|             FileUtils.writeBytes(downloadPath, response.getOutputStream()); | ||||
|         } | ||||
|         catch (Exception e) | ||||
|         { | ||||
|             log.error("下载文件失败", e); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user