[python] 취약한 파일 업로드 방지
웹 애플리케이션에서 파일 업로드 기능을 구현할 때 보안에 주의해야 합니다. 파일 업로드 기능은 공격자가 악성 파일을 업로드하고 실행할 수 있는 취약점이 될 수 있습니다. 여기에는 몇 가지 중요한 보안 기법이 필요합니다.
파일 업로드 취약성
파일 업로드 취약성은 악성 코드를 업로드하여 서버를 공격할 수 있는 가능성이 있는 취약점입니다. 일반적으로 파일 업로드에 대한 검사 및 제한이 부족하거나 악성 파일을 업로드하는 데 사용할 수 있는 응용 프로그램의 취약성이 존재할 수 있습니다.
취약점 방지를 위한 조치
1. 파일 확장자 및 MIME 유형 검사
악성 파일 업로드를 방지하기 위해 업로드된 파일의 확장자 및 MIME 유형을 검사해야 합니다.
import os
import magic
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def allowed_mime_type(file):
mime = magic.Magic(mime=True)
mimetype = mime.from_file(file)
return mimetype in ['text/plain', 'application/pdf', 'image/png', 'image/jpeg', 'image/gif']
2. 파일 크기 제한
큰 파일을 업로드하여 서버 리소스를 소비하거나 공격을 시도하는 것을 방지하기 위해 파일의 크기를 제한해야 합니다.
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB
3. 업로드된 파일 저장 위치
서버에서 업로드된 파일을 저장할 때 웹 루트 경로 외부에 저장하여 실행 가능한 파일의 업로드를 방지합니다.
결론
파일 업로드 보안은 웹 애플리케이션 보안에 중요한 부분입니다. 악성 파일 업로드를 방지하기 위해 파일의 확장자 및 MIME 유형을 검사하고 파일 크기를 제한하는 등의 조치가 필요합니다. 파일 업로드 기능을 구현할 때 이러한 보안 최적화를 고려해야 합니다.
참고 자료
- Flask File Uploading: https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/
- Magic library: https://pypi.org/project/python-magic/