현재 위치: > 최신 기사 목록> PHP에서 파일 업로드 및 다운로드를 위해 사용자 입력 및 출력 기능을 사용하는 방법은 무엇입니까?

PHP에서 파일 업로드 및 다운로드를 위해 사용자 입력 및 출력 기능을 사용하는 방법은 무엇입니까?

M66 2025-06-06

PHP에서 안전 파일 업로드 및 다운로드 구현 : 사용자 입력 및 출력 기능의 올바른 사용

웹 개발에서 파일 업로드 및 다운로드는 일반적인 기능 모듈입니다. 그러나 사용자 입력 및 출력이 엄격하게 제어되지 않으면 공격의 진입 점이되기 쉽습니다. 이 기사는 PHP 언어에 중점을두고 파일 업로드 및 다운로드 중 보안을 효과적으로 제어하기 위해 사용자 입력 및 출력 기능을 사용하는 방법을 소개합니다.

파일 업로드를위한 보안 제어 방법

1. 파일 유형을 제한합니다

업로드 요청을 처리하기 전에 첫 번째 단계는 파일 유형을 확인하는 것입니다. 이것은 일반적으로 파일 확장 및 마임 유형의 2 단계 검증으로 수행 할 수 있습니다.

 
$allowedExtensions = ['jpg', 'png', 'gif'];
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];

$uploadedFileExtension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$uploadedFileType = $_FILES['file']['type'];

if (!in_array($uploadedFileExtension, $allowedExtensions) || 
    !in_array($uploadedFileType, $allowedMimeTypes)) {
    // 불법 파일 유형,처리 로직을 수행하십시오
}

2. 업로드 파일의 이름을 바꿉니다

악성 스크립트 실행 및 경로 덮어 쓰기 공격을 방지하려면 사용자가 업로드 한 파일 이름을 자동으로 바꾸는 것이 좋습니다.

 
$uploadedFileName = $_FILES['file']['name'];
$uploadedFileExtension = strtolower(pathinfo($uploadedFileName, PATHINFO_EXTENSION));

$newFileName = uniqid() . '.' . $uploadedFileExtension;
$newFilePath = '/path/to/upload/directory/' . $newFileName;

if (move_uploaded_file($_FILES['file']['tmp_name'], $newFilePath)) {
    // 파일 업로드를 성공적으로 업로드하십시오
}

3. 컨텐츠 수준 보안 검사를 수행하십시오

확장 및 MIME 검증 외에도 파일의 실제 내용을 추가로 분석하는 것이 좋습니다. 예를 들어, getImagesize () 또는 타사 라이브러리를 사용하여 업로드 된 파일이 실제 이미지인지 확인할 수 있습니다.

 
$fileData = file_get_contents($_FILES['file']['tmp_name']);

if (!is_image($fileData)) {
    // 파일은 실제 사진이 아닙니다,처리 로직을 수행하십시오
}

function is_image($fileData){
    $allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];

    if (function_exists('mime_content_type')) {
        $fileMimeType = mime_content_type($fileData);
        return in_array($fileMimeType, $allowedMimeTypes);
    } else {
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        $fileMimeType = $finfo->buffer($fileData);
        return in_array($fileMimeType, $allowedMimeTypes);
    }
}

파일 다운로드를위한 보안 관리 조치

1. 사용자 액세스 권한을 확인하십시오

파일 다운로드 로직을 실행하기 전에 사용자가 요청한 파일이 존재하고 액세스 권한이 있는지 확인해야합니다.

 
$requestedFilePath = $_GET['file'];

if (!is_file($requestedFilePath) || !is_readable($requestedFilePath)) {
    // 파일이 존재하지 않거나 읽을 수 없습니다
}

2. 올바른 HTTP 응답 헤더를 설정하십시오

브라우저가 실수로 다운로드 컨텐츠를 실행하는 것을 방지하려면 파일 다운로드에 필요한 HTTP 헤더 정보를 설정해야합니다.

 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($requestedFilePath));
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($requestedFilePath));

readfile($requestedFilePath);

요약

PHP에서 파일 업로드 및 다운로드를 구현할 때는 기본 기능에만 의존하는 것만으로는 충분하지 않습니다. 보다 신뢰할 수 있고 안전한 파일 관리 시스템은 파일 유형 확인, 프로세싱 변경, 보안 스캔 및 권한 제어와 같은 여러 수단으로 구축해야합니다. 또한 업로드 파일 크기를 제한하고 업로드 디렉토리 권한을 제어하며 다운로드 남용 및 기타 자세한 전략을 방지하는 것이 좋습니다.