1)
위험한 형식 파일 업로드
서버측에서 실행될 수 있는 스크립프 파일(asp, jsp, php 파일 등)이 업로드 가능하고, 이 파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우 공격자는 스크립트 파일을 업로드하고 이 파일을 통해
내부명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있다.
n 안전한 코딩
기법
① 업로드하는
파일의 타입과 크기를 제한한다.
② 업로드
디렉토리를 웹서버의 다큐먼트 외부에 설정한다.
③ 화이트리스트
방식의 허용된 확장자만 업로드되도록 하고, 확장자도 대소문자 구분 없이 처리하도록 한다.
④ 공격자의
웹을 통한 직접 접근을 차단한다. 또한, 파일 실행 여부를
설정할 수 있는 경우, 실행 속성을 제거한다.
1. // org.springframework.web.multipart
2. public void upload(HttpServletRequest request) throws ServletException {
3. MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
4. String next = (String) mRequest.getFileNames().next();
5. MultipartFile file = mRequest.getFile(next);
6. if (file == null)
7. return;
8.
9. // 업로드 파일 사이즈 크기 제한
10. int size = file.getSize();
11. if (size > MAX_FILE_SIZE)
12. throw new ServletException("error");
13.
14. // MultipartFile로 부터 file을 얻음
15. String fileName = file.getOriginalFilename().toLowerCase();
16.
17. // 화이트리스트 방식으로 업로드 파일의 확장자를 체크한다.
18. if (fileName != null) {
19. if (fileName.endsWith(".doc") || fileName.endsWith(".hwp")
20. || fileName.endsWith(".pdf") || fileName.endsWith(".xls")){
21. /* file 업로드 루틴 */
22. } else
23. throw new ServletExeption("error");
24. }
25. // 업로드 파일의 디렉터리 위치는 다큐먼트 루트의 밖에 위치 시킨다.
26. File uploadDir = new File("/app/webapp/data/upload/notice");
27. String uploadFilePath = uploadDir.getAbsolutePath() + "/" + fileName;
28. /* 이하 file upload 루틴*/
29. }
댓글 없음:
댓글 쓰기