2015년 12월 1일 화요일

입력데이터 검증 및 표현 - 위험한 형식 파일 업로드

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.  }  

댓글 없음:

댓글 쓰기