파일 업로드 · 3 min read · Dec 07, 2025
업로드된 파일을 자동으로 바이러스 검사하는 방법 - php-clamavlib - 2페이지
5 작은 예제
이제 HTML 업로드 양식을 포함하는 작은 업로드 스크립트인 /var/www/upload.php를 생성하겠습니다. 양식을 제출하면 스크립트가 자신을 호출하고 cl_info(), cl_scanfile(), cl_setlimits(), clam_get_version()를 사용하여 업로드된 파일을 바이러스 검사합니다. 파일이 정상이라면 /var/www/uploads에 업로드되고, 그렇지 않으면 스크립트가 오류 메시지를 표시하고(어떤 바이러스/웜 등을 발견했는지) 서버에서 파일을 삭제합니다.
먼저, /var/www/uploads 디렉토리를 생성하고 Apache 사용자(www-data)가 쓸 수 있도록 설정해야 합니다:
mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads
그런 다음 /var/www/upload.php 파일을 생성합니다:
vi /var/www/upload.php| ClamAV 버전: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> |
파일 업로드 양식이 포함되어 있습니다:
| [...] [...] |
파일을 선택하고 제출 버튼을 클릭하면 스크립트가 자신을 호출하고(action=”upload.php”) 상단의 PHP 코드를 실행합니다:
| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= '업로드할 파일을 선택해 주세요!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= '악성코드 발견: '.$malware.' |
ClamAV 버전: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
업로드된 파일에 대한 세부정보는 $_FILES 배열에 저장되므로 이를 사용하여 파일을 확인합니다(배열에 저장된 내용을 보려면 print_r($_FILES); 줄의 주석을 제거할 수 있습니다).
나는 cl_setlimits() 함수를 사용하여 바이러스 검사 프로세스의 제한을 설정하여 DOS 공격(바이러스 검사 프로세스가 시스템의 모든 리소스를 소모할 수 있는 경우)을 방지합니다. 사용법은 다음과 같습니다:
cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) - $maxreclevel: 정수 값 / 최대 재귀 수준 /
- $maxfiles: 정수 값 / 아카이브 내에서 스캔할 최대 파일 수 /
- $maxratio: 정수 값 / 최대 압축 비율 /
- $archivememlim: 불리언 / bzip2의 메모리 사용량 제한 (0/1) /
- $maxfilesize: 긴 정수 / 이 값(바이트 단위)보다 큰 아카이브 파일은 스캔되지 않음 /
기본적으로 이러한 값은 아카이브(zip 파일, tar.gz 파일, bz2 파일 등)를 스캔할 때 ClamAV의 동작을 정의합니다. cl_setlimits() 함수를 사용하지 않으면 php.ini의 해당 값이 사용됩니다.
주요 함수는 cl_scanfile() 함수로, 스캔할 파일의 경로를 인수로 받습니다. 업로드된 파일은 처리되기 전에 임시로 저장됩니다(일반적으로 /tmp; php.ini 설정에 따라 다름). 해당 임시 파일은 $_FILES[‘file’][‘tmp_name’]에 저장되므로 해당 변수를 cl_scanfile() 함수에 전달합니다. 바이러스가 발견되지 않으면 FALSE를 반환하고, 그렇지 않으면 발견된 바이러스의 이름을 반환합니다.
clam_get_version()은 인수를 받지 않습니다. 이 함수는 설치된 ClamAV의 버전(예: 0.88.4)을 반환합니다.
마지막으로 cl_info() 함수를 사용합니다. 이 함수는 clam_get_version()과 마찬가지로 인수를 받지 않습니다. ClamAV에 대한 더 자세한 정보를 표시합니다. 예를 들어 ClamAV 버전 0.88.4와 85917개의 바이러스 서명이 로드되었습니다.
이제 테스트해 보겠습니다. 브라우저에 http://192.168.0.100/upload.php를 입력하세요. 다음과 같은 화면이 표시되어야 합니다:

Browse…를 클릭하고 하드 디스크에서 업로드할 파일을 선택하세요(바이러스가 없고 2MB보다 작은 파일 - 이는 기본 최대 업로드 크기이며 php.ini에서 변경할 수 있습니다):

업로드가 성공해야 하며, 다음과 같은 화면이 표시되어야 합니다:

이제 테스트할 바이러스를 가져와야 합니다. 다행히 Eicar 테스트 바이러스가 있습니다. 이 파일은 해를 끼치지 않지만 모든 바이러스 스캐너에 서명이 포함되어 있어 이 테스트 바이러스를 사용하여 바이러스 스캐너가 작동하는지 테스트할 수 있습니다. http://www.eicar.org/anti_virus_test_file.htm로 가서 eicar.com, eicar_com.zip 및 eicarcom2.zip 파일을 하드 디스크에 다운로드하세요. 그런 다음 각 파일로 업로드를 테스트하세요:

모든 것이 잘 진행되면 php-clamavlib가 바이러스를 인식하고 업로드를 거부해야 합니다:

6 링크
- php-clamavlib: http://packages.debian.org/unstable/source/php-clamavlib
- PHP: http://www.php.net
- ClamAV: http://www.clamav.net
- Apache: http://httpd.apache.org
- Eicar 테스트 바이러스: http://www.eicar.org/anti_virus_test_file.htm
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.