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

댓글 없음:

댓글 쓰기