From 3a47fb81856937bf470f7ad8a5de8e25e2443f6f Mon Sep 17 00:00:00 2001 From: KNKIM Date: Tue, 3 Aug 2021 11:39:03 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/fileupload/bbs/qna/.gitignore | 8 +- ...052436092_0A84FA72B1B1478ABEB285536B81B587 | Bin 10519 -> 10178 bytes ...052436092_F1DB407F181A4B8AAA0859E56D4EDB57 | Bin 10519 -> 10165 bytes ...052436092_F1F06656D13C451BA42E21B4028F3838 | Bin 10519 -> 0 bytes .../nlib/cmm/fileupload/DownloadView.java | 13 +-- .../cmm/fileupload/FileUploadController.java | 95 ++++++++++++++---- src/main/java/nlib/util/FileUtil.java | 10 ++ .../springmvc/dispatcher-servlet.xml | 8 ++ 8 files changed, 102 insertions(+), 32 deletions(-) delete mode 100644 data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 diff --git a/data/fileupload/bbs/qna/.gitignore b/data/fileupload/bbs/qna/.gitignore index eedfeaba..f861d22d 100644 --- a/data/fileupload/bbs/qna/.gitignore +++ b/data/fileupload/bbs/qna/.gitignore @@ -1,4 +1,4 @@ -/F20210716045132766_5A30C3D2F8AB44A6867D76329E4502E2 -/F20210716045132766_B48A0FCFBE2D46D290B31DDECB61DA9B -/F20210716045247870_C228F5BAD6894E66A50B48F63CA8916C -/F20210716045247870_E8D7EB4610604852982585486F9BAD5A +/* +!/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 +!/F20210802052436092_F1DB407F181A4B8AAA0859E56D4EDB57 + diff --git a/data/fileupload/bbs/qna/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 b/data/fileupload/bbs/qna/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 index be14bd8a064cc64c487917ae3a143c3ef6b45c62..8eed248cc767bed53cdbe4b77b69f0c263376043 100644 GIT binary patch delta 2861 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 LI3!-`_vL>8aZxmc delta 3186 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 diff --git a/data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 b/data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 deleted file mode 100644 index be14bd8a064cc64c487917ae3a143c3ef6b45c62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10519 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 -1 || userAgent.indexOf("Trident") > -1){ - //fileName = URLEncoder.encode(file.getName(), "utf-8").replaceAll("\\+", "%20");; + encfileName = URLEncoder.encode(fileName, "utf-8").replaceAll("\\+", "%20");; }else if(userAgent.indexOf("Chrome") > -1) { StringBuffer sb = new StringBuffer(); - for(int i=0; i '~') { sb.append(URLEncoder.encode(""+c, "UTF-8")); }else { sb.append(c); } } - //fileName = sb.toString(); + encfileName = sb.toString(); }else { - //fileName = new String(file.getName().getBytes("utf-8")); + encfileName = new String(fileName.getBytes("utf-8")); } response.setContentType(getContentType()); response.setContentLength((int)file.length()); - response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + encfileName + "\";"); response.setHeader("Content-Transfer-Encoding", "binary"); OutputStream out = response.getOutputStream(); diff --git a/src/main/java/nlib/cmm/fileupload/FileUploadController.java b/src/main/java/nlib/cmm/fileupload/FileUploadController.java index e3501e34..a4e65e58 100644 --- a/src/main/java/nlib/cmm/fileupload/FileUploadController.java +++ b/src/main/java/nlib/cmm/fileupload/FileUploadController.java @@ -76,7 +76,22 @@ public class FileUploadController { * 첨부파일 임시 저장 위치 */ private String FILEUPLOAD_TEMP_SUBPATH = nlibProperty.getProperty("fileupload.temp.subpath"); + + /** + * 경로 부적합 오류 메시지 + */ + private static final String MSG_NOT_VALID_FILE_PATH = "파일 경로가 부적합합니다. 관리자에게 문의하여 주시기 바랍니다."; + + /** + * 파일업로드(Ajax) 처리 + * - 화면 : Javascript Free Open Framework DropZone 사용 + * + * @param multiRequest + * @param subPathKey + * @param response : 파일정보를 담은 JSON String + * @return + */ @ResponseBody @RequestMapping(value="/fileupload/uploadFilesAjax.do", produces="application/json") public ResponseEntity uploadFilesAjax( @@ -84,22 +99,47 @@ public class FileUploadController { , @RequestParam("subPathKey") String subPathKey , HttpServletResponse response) { - // TODO : 권한 체크 추가할 것 + String message = null; + // TODO : 권한 체크 추가할 것 List result = new ArrayList(); try { // 최상위 위치 - if(FileUtil.isNotValid(FILEUPLOAD_BASE_PATH)) throw new Exception("첨부파일이 저장되는 최상위 위치값이 적절하지 않습니다."); + if(FileUtil.isEmpty(FILEUPLOAD_BASE_PATH)) { + message = "첨부파일이 저장되는 최상위 위치정보값이 정확하지 않습니다."; + log.error(message + " : FILEUPLOAD_BASE_PATH 값 부재"); + ErrorMessage errorMessage = new ErrorMessage("ERROR", message); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage); + } // 서브 위치 - if(StringUtil.isEmpty(subPathKey)) throw new Exception("첨부파일이 저장되는 위치정보값이 정확하지 않습니다."); + if(StringUtil.isEmpty(subPathKey)) { + message = "첨부파일이 저장되는 하위 위치정보값이 정확하지 않습니다."; + log.error(message + " : 매개변수 subPathKey 값 부재"); + ErrorMessage errorMessage = new ErrorMessage("ERROR", message); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage); + } String subPath = nlibProperty.getProperty(subPathKey); - if(FileUtil.isNotValid(subPath)) throw new Exception("첨부파일 서브 위치값이 적절하지 않습니다."); + if(StringUtil.isEmpty(subPath)) { + message = "첨부파일이 저장되는 하위 위치정보값을 찾을 수 없습니다."; + log.error(message + " : 매개변수 subPathKey의 속성값 부재"); + ErrorMessage errorMessage = new ErrorMessage("ERROR", message); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage); + } + // 위치정보 적합 확인 + if(FileUtil.isNotValid(FILEUPLOAD_BASE_PATH + subPath)) { + message = MSG_NOT_VALID_FILE_PATH; + log.error(message + " : " + (FILEUPLOAD_BASE_PATH + subPath)); + ErrorMessage errorMessage = new ErrorMessage("ERROR", message); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage); + } + + // 파일 업로드 처리 final Map files = multiRequest.getFileMap(); - log.debug("uploadFilesAjax : 진입 " + (files == null ? " files null " : files.size())); + log.debug("uploadFilesAjax : 진입 > 파일수 = " + (files == null ? " files null " : files.size())); File dir = new File(FILEUPLOAD_BASE_PATH + subPath); if(!dir.exists() || !dir.isDirectory()) dir.mkdirs(); @@ -119,37 +159,30 @@ public class FileUploadController { String orginFileName = file.getOriginalFilename(); //-------------------------------------- - // 원 파일명이 없는 경우 처리 + // 원 파일명이 없는 경우 처리 SKIP // (첨부가 되지 않은 input file type) //-------------------------------------- - if ("".equals(orginFileName)) { + if (orginFileName == null || "".equals(orginFileName)) { continue; } - ////------------------------------------ int index = orginFileName.lastIndexOf("."); - //String fileName = orginFileName.substring(0, index); - String fileExt = orginFileName.substring(index + 1); - //String newName = KeyStr + getTimeStamp() + fileKey; + String fileExt = (index < 1 ? "" : orginFileName.substring(index + 1)); String newName = UUID.getPhysicalFileName(); long size = file.getSize(); - log.debug("FILE UPLOAD : File New Name=" + newName); - if (!"".equals(orginFileName)) { filePath = FILEUPLOAD_BASE_PATH + subPath + "/" + newName; log.debug("FILE UPLOAD : filePath=" + filePath); - file.transferTo(new File(EgovWebUtil.filePathBlackList(filePath))); + file.transferTo(new File(FileUtil.filePathBlackList(filePath))); } fvo = new FileVO(); fvo.setFileExtsn(fileExt); - //fvo.setFileStreCours(storePathString); fvo.setFileMg(Long.toString(size)); fvo.setOrignlFileNm(orginFileName); fvo.setStreFileNm(newName); - //fvo.setAtchFileId(atchFileIdString); fvo.setFileSn(String.valueOf(fileKey)); result.add(fvo); @@ -172,25 +205,43 @@ public class FileUploadController { } catch (JsonProcessingException e) { json = null; e.printStackTrace(); + ErrorMessage errorMessage = new ErrorMessage("ERROR", "JSON 변환 처리에 실패하였습니다 : " + e.toString()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMessage); } HttpHeaders responseHeaders = new HttpHeaders(); - //responseHeaders.set("Content-Type", "application/json; charset=UTF-8"); - ResponseEntity ret = ResponseEntity.ok().headers(responseHeaders).body(json); return ret; } - + + /** + * 파일 다운로드를 처리한다. + * + * @param params + * @param mv + * @return + * @throws Exception + */ @RequestMapping(value="/fileupload/downloadFiles.do") - public ModelAndView download(@RequestParam HashMap params, ModelAndView mv) { + public ModelAndView download(@RequestParam HashMap params, ModelAndView mv) throws Exception { + + // TODO 권한 설정 기능 추가 필요 + String fid = (String) params.get("fid"); String fname = (String) params.get("fname"); String subPath = nlibProperty.getProperty((String) params.get("subPathKey")); String fullPath = FILEUPLOAD_BASE_PATH + "/" + subPath + "/" + fid; - File file = new File(fullPath); + if(FileUtil.isNotValid(fullPath)) { + throw new Exception(MSG_NOT_VALID_FILE_PATH); + } - mv.setViewName("downloadView"); + File file = new File(FileUtil.filePathBlackList(fullPath)); + if(!file.isFile()) { + throw new Exception("파일 정보가 부적합합니다. 관리자에게 문의하여 주시기 바랍니다."); + } + + mv.setViewName("downloadView"); // dispatcher-servlet.xml내 BeanNameViewResolver 정의 mv.addObject("downloadFile", file); mv.addObject("fname", fname); diff --git a/src/main/java/nlib/util/FileUtil.java b/src/main/java/nlib/util/FileUtil.java index 027dcf30..571e223f 100644 --- a/src/main/java/nlib/util/FileUtil.java +++ b/src/main/java/nlib/util/FileUtil.java @@ -1,5 +1,6 @@ package nlib.util; +import egovframework.com.cmm.EgovWebUtil; import egovframework.com.utl.fcc.service.EgovStringUtil; /** @@ -50,4 +51,13 @@ public class FileUtil extends EgovStringUtil { return !isValid(pathOrFilename); } + /** + * 파일 경로 문자열에서 보안 문제가 되는 문자를 제거하여 리턴한다. + * + * @param path + * @return + */ + public static String filePathBlackList(String path) { + return EgovWebUtil.filePathBlackList(path); + } } diff --git a/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml index 087a7bf6..92966eb0 100644 --- a/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml @@ -82,4 +82,12 @@ + + + + + + + + \ No newline at end of file