PHP의 is_uploaded_file() 함수는 지정한 파일이 HTTP POST 방식으로 업로드되었는지 확인하는 함수입니다. 파일이 HTTP POST를 통해 정상적으로 업로드되었다면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.
이 함수는 공격자가 $_FILES 배열을 조작해 서버의 중요한 파일(설정 파일, 비밀번호 파일 등)에 접근하는 것을 막는 보안 검증 목적으로 널리 사용됩니다. 따라서 업로드된 파일을 실제로 처리하기 전에 이 함수로 한 번 더 확인하는 것이 안전합니다.
문법
is_uploaded_file(file_path)
매개변수
file_path − 업로드 여부를 확인할 파일의 경로를 지정합니다. 일반적으로
$_FILES['userfile']['tmp_name']값을 전달합니다.
반환값
파일이 HTTP POST를 통해 업로드된 경우 TRUE를, 실패한 경우 FALSE를 반환합니다.
다음과 같은 내용을 담은 "new.txt" 파일을 업로드한다고 가정해 보겠습니다.
This is demo text!
예제 1
<?php
// HTTP POST로 업로드된 파일인지 확인
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo "File ". $_FILES['userfile']['name'] ." uploaded successfully!\n";
// 업로드된 파일의 내용 읽어서 출력
echo "Reading Contents of the file:\n";
readfile($_FILES['userfile']['tmp_name']);
} else {
echo "File ". $_FILES['userfile']['name'] ." failed in uploading! File upload attack could be the reason!\n";
}
?>출력 결과
File new.txt uploaded successfully! Reading Contents of the file: This is demo text!
업로드가 성공하면 파일 이름과 함께 성공 메시지가 출력되고, readfile()을 통해 업로드된 파일의 내용도 그대로 화면에 표시됩니다.
이번에는 "details.txt" 파일을 사용한 또 다른 예제입니다.
예제 2
<?php
$file = "details.txt";
if(is_uploaded_file($file)) {
echo ("Uploaded via HTTP POST");
} else {
echo ("Not uploaded via HTTP POST");
}
?>출력 결과
Not uploaded via HTTP POST!
"details.txt"는 HTTP POST 업로드 과정을 거치지 않고 코드에서 직접 지정한 파일이므로 FALSE가 반환되어 위와 같은 결과가 출력됩니다.
참고 사항
- 업로드된 파일을 최종 위치로 옮길 때는
move_uploaded_file()함수를 함께 사용하면 더욱 안전합니다. - is_uploaded_file() 함수는 PHP 4.0.3 이상 버전에서 사용할 수 있습니다.