다음 코드에서 보안상 위험한 부분과 개선 방법은?

과목: PHP

문제 번호: 2939

hard
다음 코드에서 보안상 위험한 부분과 개선 방법은?
// 사용자가 요청한 파일 다운로드 기능
$filename = $_GET['file'];
echo readfile($filename);
A. 문제없음, 그대로 사용 가능
B. 파일 존재 여부만 확인하면 됨
C. 경로 탐색 공격 위험, 파일 확장자와 경로 검증 필요
D. readfile 대신 다른 함수 사용 필요

정답: C



사용자 입력을 직접 파일 경로로 사용하는 것은 심각한 보안 취약점입니다.

⦁ 주요 보안 위험:
⦁ 경로 탐색 공격: ../../../etc/passwd 같은 입력
⦁ 시스템 파일 접근: 중요한 설정 파일 노출
⦁ 임의 파일 다운로드: 의도하지 않은 파일 접근

⦁ 공격 시나리오 예시:
http://example.com/download.php?file=../../../etc/passwd
http://example.com/download.php?file=../config/database.php

⦁ 보안 개선 방안:
$filename = $_GET['file'];

// 1. 허용된 파일 확장자 검사
$allowed = ['txt', 'pdf', 'jpg', 'png'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if (!in_array(strtolower($ext), $allowed)) {
    die('허용되지 않은 파일 형식입니다.');
}

// 2. 경로 탐색 문자 제거
$filename = basename($filename);

// 3. 지정된 디렉토리 내에서만 접근 허용
$filepath = 'uploads/' . $filename;

// 4. 파일 존재 확인
if (file_exists($filepath)) {
    echo readfile($filepath);
}

💡 학습 팁

이 문제를 포함한 PHP 과목의 모든 문제를 순차적으로 풀어보세요. 진행상황이 자동으로 저장되어 언제든지 이어서 학습할 수 있습니다.