Skip to content

Repository files navigation

flow_test

flow 채용과제

과제 설명

파일 확장자 차단 과제

  • 어떤 파일들은 첨부시 보안에 문제가 될 수 있다 ex) exe, sh ... 등 실행파일이 존재할 경우 서버에 올려서 실행될 위험이 있음(해킹가능성)
  • 따라서 파일 확장자 차단을 해야한다

요건

  1. 고정 확장자는 차단을 자주하는 확장자의 리스트 기본은 unchk되어 있으나 chk할 경우 DB에 차단된 확장자명이 저장
  2. 차단된 고정확장자는 새로고침되어도 chk상태를 유지
  3. 커스텀 확장자는 사용자가 직접 차단할 확장자명을 입력하는 것
  4. 커스텀 확장자는 최대 입력 자릿수는 20자리, 추가버튼 클릭시 DB에 저장
  5. 마찬가지로 새로고침시에도 차단시킨 확장자명이 고정되어야 할 것 같다.
  6. 최대 200개 추가 가능, x버튼 클릭시 db에 삭제

추가로 해당 서비스에 필요하다 생각하는 것

  1. 커스텀 확장자 중복 체크 - 고정 확장명을 커스텀 확장자로 추가하려할 때 오류발생
  2. 같은 이름의 파일이 들어갈 경우 구분해야함 - 파일 업로드시 랜덤숫자와 업로드시간을 조합해 업로드 되게 함
  3. 업로드하는 파일크기 제한, 파일명 제한 - 비용의 문제, 시스템 과부하 방지
  4. 파일 업로드시 확장자명 수정해서 업로드 할 수 있다 - 파일의 시그니처를 파싱한다, 파싱 후 db에 저장된 확장자명일 경우 업로드 차단

선택

  1. multer, AWS S3

    • AWS S3는 여러 개의 AWS시설에서 관리하기 때문에 데이터 유실이 99.99% 의 내구성을 가진다 한다 따라서 혹여나 사용자의 중요한 파일이 유실될 가능성이 거의 없다
    • 거의 무제한에 가까운 확장성, 뛰어난 보안
    • AWS는 전 세계 여러 지역에 데이터 센터를 운영하므로 사용자의 데이터를 저장할 지역을 선택가능 사용자에게 더 빠른 업로드,다운로드 엑세스 속도 향상
    • 하지만 비용문제가 있을 수 있음 이러한 서비스를 제공하는데에는 이유가 있음
  2. 확장자명을 DB에 저장한다

    • sequlize 문법으로 간단하게 추가,조회,삭제가능
  3. 고정확장자와 커스텀확장자를 분리된 컬럼에서 관리하려했으나 고정확장자는 자주사용하는 차단확장자이므로 그럴 필요가 없다 판단, 인터페이스에서 차단시키는 과정 (check박스, input박스)의 차이로 나눌예정이라 따로 구분은 하지않음

  4. 파일 업로드 차단시키기

    • 파일업로드시 DB에 해당 파일의 확장자명과 동일한 차단확장자명이 존재한다면 업로드 차단
    • 단점
    • 보안 이슈 : 사용자가 파일의 확장자를 조작 "파일명.jpg"로 저장하면서 내용은 스크립트 코드를 구성해서 업로드할 가능성
    • 해결 방법 : 파일 시그니처 검사 - 파일의 시그니처(매직 넘버)를 확인하여 파일의 실제 형식을 파악할 수 있다 예) 'ffd8ffe0': 'jpg', '89504e47': 'png'

과제를 진행하면서의 가장 큰 고민 ( 진행 중 )

고민 : 파일 업로드시 확장자명 수정해서 업로드 할 수 있다 이유 : exe 파일은 서버에서 실행되게 된다면 큰 영향을 줄 수 있다.

시도 :

  1. file-type 라이브러리를 사용하여 파일이 업로드 전 파일의 시그니처를 검사하여 파일의 본래 확장자를 파악 후 DB에 저장된 차단할 확장자명과 같은 확장자일 경우 업로드 차단 1-1. S3에 파일을 바로 저장하기 때문에 파일의 시그니처를 검사 못함 - multerMemoryStorage를 사용해서 메모리에 파일의 내용을 저장 후 시그니처 검토

  2. mmmagic 라이브러리를 사용해서 파일의 매직 바이트(파일의 내용에서 특정 위치에 있는 일련의 바이트로, 해당 파일의 형식이나 데이터 형식을 식별하는 데 사용된다. 파일이 어떤 유형인지 빠르게 식별하는 데 사용되는 간단하고 효과적인 방법) 를 읽어 파일의 내용을 기반으로 그 파일이 어떤 종류의 파일인지 식별

  3. UUID와 같은 라이브러리를 사용하여 정말로 고유한 ID를 생성하는 것을 고려

    • UUID는 전역적으로 고유하다 따라서 어떤 DB나 다른 시스템과 충돌 가능성이 거의 없다, 예측할 수 없는 고유번호를 발급하기 때문에 보안강화
    • 하지만 순차적인 번호가 아니므로 효율적으로 데이터를 정렬하기 어렵다 ( 파일원본이름과 등록시간을 앞쪽에 배치하여 등록된 이름을 설정 경우에 따라 배치순서를 바꿔서 순차적 정렬가능)

아쉬운 점

  1. file-type과 mmagic 라이브러리를 사용하여 파일의 본질적인 확장자를 판별하여 사용자가 임의로 파일의 확장자명을 변경해서 업로드 차단을 피해 업로드하는 일을 차단하기 위해 해당 라이브러리를 사용하여 파일의 시그니처, 매직바이트를 판단해서 처리
    • 두개의 라이브러리를 사용해서 모두 진행해보았지만 둘다 파일의 본질적인 확장자명은 판단이 되어 console.log에 표시되긴했지만, 파일을 임시로 저장하는 메모리는 항상 undifined로 표시
    • s3로 바로 저장되기때문에 파일의 내용을 열어보고 처리할 메모리를 할당시켜(multerMemoryStorage) 중간에 저장하여 처리하게끔 실행하였지만, 계속 undifined로 뜨게된다
    • 하지만 파일의 확장자명을 바꿔서 올려도 해당 라이브러리로 파일의 내용을 판독하는 것에는 성공하였다
    • 결국 시간상 해당 라이브러리를 사용하여 변조된 파일확장자를 필터링하는 것에는 실패하게 되었다. 하지만 해당 필터링은 필요없을 수도 있다.
    • 예를 들어 exe파일을 txt로 변경해서 업로드하여도 S3 자체에서 자동으로 실행될 경우는 없다고 알게되었다. 또한 aws의 서비스보안 덕에 그럴 걱정이 없다고 한다.
    • 결국엔 100% 안전할 순 없다할수있다. 후에 더 공부하고 알아본다면 반드시 완성시킬 수 있다 생각한다.

About

fileUpload_helper

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages