- 업로드하는 파일 타입과 크기를 제한하고, 업로드 디렉터리를 웹 서버의 다큐먼트 외부에 설정한다.
- 화이트리스트 방식으로 허용된 확장자만 업로드되도록 하고, 확장자도 대소문자 구분 없이 처리하도록 한다.
- 공격자의 웹을 통한 직접 접근을 차단한다, 또한, 파일 실행 여부를 설정할 수 있는 경우, 실행 속성을 제거한다.
> 보안에서 화이트리스트란 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식 또는 그 지정된 대상들을 말한다.블랙리스트 반대 개념.
안전하지 않은 코드 ▼
public void upload(HttpServletRequest request) throws ServletException {
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
String next = (String) mRequest.getFileName().next();
MultipartFile file = mRequest.getFile(next);
//MultipartFile로부터 file을 얻음
String fileName = file.getOriginalFilename();
//upload 파일에 대한 확장자, 크기의 유효성 체크를 하지 않음
File uloadDir = new File("/app/webapp/data/upload/notice");
String uploadFilePath = uploadDir.getAbsolutePath() + "/" + fileName;
}
안전한 코드 ▼
public void upload(HttpServletRequst request) throws ServletException {
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequset) request;
String next = (String) mRequest.getFileNames().next();
MultipartFile file = mRequest.getFile(next);
if ( file == null )
return;
//업로드 파일 크기를 제한한다.
int size = file.getSize();
if ( size > MAX_FILE_SIZE ) throw new ServletException("에러");
//MultipartFile로 부터 file을 얻음
String fileName = file.getOriginalFilename().toLowerCase();
//화이트 리스트 방식으로 업로드 파일의 확장자 체크
if( fileName != null ) {
if(fileName.endsWith(".doc")||fileName.endsWith(".hwp")||fileName.endsWith(".pdf")||
fileName.endsWith(".xls") ) {
/* 파일 업로드 */
} else throw new ServletException("에러");
//업로드 파일의 디렉터리 위치는 다큐먼트 루트의 밖에 위치시킨다.
File uploadDir = new File("/app/webapp/data/upload/notice");
String uploadFilePath = uploadDir.getAbsolutePath() + "/" + fileName;
}
반응형
'Web Security > SecureCoding' 카테고리의 다른 글
크로스사이트 요청 위조 (0) | 2022.11.16 |
---|---|
신뢰 되지 않는 URL 주소로 자동 접속 연결 (0) | 2022.11.15 |
크로스 사이트 스크립트 (0) | 2022.11.11 |
자원 삽입 (0) | 2022.11.11 |
SQL 삽입 (0) | 2022.11.11 |
댓글