바이러스 검사 · 3 min read · Oct 27, 2025

php-clamavlib로 업로드된 파일을 자동으로 바이러스 검사하는 방법

php-clamavlib로 업로드된 파일을 자동으로 바이러스 검사하는 방법

버전 1.0
저자: Falko Timme

이 가이드는 PHP와 ClamAV를 사용하여 서버의 웹 양식을 통해 사용자가 업로드한 파일을 자동으로 검사하는 방법을 설명합니다. 이렇게 하면 업로드 양식이 악성 소프트웨어를 배포하는 데 악용되지 않도록 할 수 있습니다. PHP와 ClamAV를 연결하기 위해, 현재 문서화가 부족한 php5-clamavlib/php4-clamavlib 패키지를 설치합니다. 이 패키지는 Debian Etch 및 Sid와 Ubuntu Dapper Drake 및 Edgy Eft에서 사용할 수 있으므로 이러한 플랫폼 중 하나를 사용하고 있는지 확인하십시오.

먼저 말씀드리고 싶은 것은, 이러한 시스템을 설정하는 방법이 이것만이 아니라는 것입니다. 이 목표를 달성하는 방법은 여러 가지가 있지만, 제가 선택한 방법입니다. 이것이 여러분에게 작동할 것이라는 보장은 하지 않습니다!

1 사전 참고 사항

앞서 언급했듯이, 시스템은 Debian Etch, Sid, Ubuntu Dapper Drake 또는 Ubuntu Edgy Eft를 사용해야 하며, Apache2와 PHP4 또는 PHP5가 이미 설치되어 있어야 합니다.

Debian Sarge를 사용 중이라면, backports.org에서 php-clamavlib 패키지를 설치할 수 있습니다: http://www.backports.org/debian/pool/main/p/php-clamavlib/

기본 문서 루트로 /var/www를 사용한다고 가정합니다. 서버에 여러 웹사이트가 이미 있는 경우, 문서 루트를 필요에 맞게 조정하십시오. 또한, 이 예제에서는 192.168.0.100을 서버의 IP 주소로 사용합니다. 이것도 조정하고, 이름 기반 vhost 구성으로 여러 웹사이트가 있는 경우, IP 주소 대신 해당 도메인/FQDN을 사용하여 웹사이트에 접근해야 합니다.

여기서 모든 단계를 루트 사용자로 수행합니다. 따라서 루트로 로그인했는지 확인하거나, Ubuntu를 사용하는 경우 모든 명령 앞에 sudo를 추가하십시오. 예를 들어,

apt-get update

는 다음과 같이 변경됩니다.

sudo apt-get update  

2 /etc/apt/sources.list 수정

Ubuntu Dapper Drake 또는 Ubuntu Edgy Eft를 사용하는 경우, /etc/apt/sources.list를 수정하여 universe 저장소가 활성화되도록 해야 합니다. Debian Etch 또는 Sid를 사용하는 경우, /etc/apt/sources.list를 편집하지 마십시오.

2.1 Ubuntu Dapper Drake

/etc/apt/sources.list를 편집하고 다음 줄이 포함되어 있는지 확인하십시오: deb http://de.archive.ubuntu.com/ubuntu/ dapper universe (de.archive.ubuntu.com을 가까운 Ubuntu 미러로 교체하십시오):

vi /etc/apt/sources.list

| [...] deb http://de.archive.ubuntu.com/ubuntu/ dapper universe [...] |

그런 다음 다음을 실행하십시오.

apt-get update

패키지 데이터베이스를 업데이트합니다.

2.2 Ubuntu Edgy Eft

/etc/apt/sources.list를 편집하고 다음 줄이 포함되어 있는지 확인하십시오: deb http://de.archive.ubuntu.com/ubuntu/ edgy universe (de.archive.ubuntu.com을 가까운 Ubuntu 미러로 교체하십시오):

vi /etc/apt/sources.list

| [...] deb http://de.archive.ubuntu.com/ubuntu/ edgy universe [...] |

그런 다음 다음을 실행하십시오.

apt-get update

패키지 데이터베이스를 업데이트합니다.

3 ClamAV 및 php-clamavlib 설치

다음으로 ClamAV(우리의 바이러스 스캐너)와 PHP와 ClamAV 간의 연결을 제공하는 php-clamavlib 패키지를 설치합니다.

PHP5를 사용하는 경우, 다음을 실행하십시오:

apt-get install php5-clamavlib clamav clamav-freshclam clamav-docs arj unzoo 

PHP4를 사용하는 경우, 다음을 실행하십시오:

apt-get install php4-clamavlib clamav clamav-freshclam clamav-docs arj unzoo 

그런 다음 Apache를 재시작합니다:

/etc/init.d/apache2 restart

원하는 경우, php.ini( PHP5를 사용하는 경우 /etc/php5/apache2/php.ini, PHP4를 사용하는 경우 /etc/php4/apache2/php.ini)를 확인하여 php-clamavlib에 대한 항목이 있는지 확인할 수 있습니다. 이러한 항목은 다음과 같아야 합니다:

vi /etc/php5/apache2/php.ini

| [...] extension=clamav.so [clamav] clamav.dbpath=/var/lib/clamav clamav.maxreclevel=0 clamav.maxfiles=0 clamav.archivememlim=0 clamav.maxfilesize=0 clamav.maxratio=0 |

vi /etc/php4/apache2/php.ini

| [...] extension=clamav.so [clamav] clamav.dbpath=/var/lib/clamav clamav.maxreclevel=0 clamav.maxfiles=0 clamav.archivememlim=0 clamav.maxfilesize=0 clamav.maxratio=0 |

Debian Sarge를 사용하는 경우, backports.org에서 php-clamavlib 패키지를 설치할 수 있습니다: http://www.backports.org/debian/pool/main/p/php-clamavlib/

4 php-clamavlib 함수

php-clamavlib에서 제공하는 PHP 함수에 대한 문서는 없지만, php-clamavlib의 소스 코드에서 사용할 수 있는 함수가 무엇인지 보여주는 clamav.php라는 스크립트를 찾았습니다. 이제 /var/www 디렉토리에 동일한 스크립트를 생성합니다:

vi /var/www/clamav.php

| \n"; foreach($functions as $func) { echo $func."
\n"; } echo "
\n"; $function = 'confirm_' . $module . '_compiled'; if (extension_loaded($module)) { $str = $function($module); } else { $str = "모듈 $module가 PHP에 컴파일되지 않았습니다"; } echo "$str\n"; ?>
|

이제 브라우저에서 http://192.168.0.100/clamav.php를 입력하십시오. 출력은 다음과 같아야 합니다:

테스트 확장에서 사용 가능한 함수:
cl_info
cl_scanfile
cl_scanbuff
cl_setlimits
cl_scanfile_ex
cl_scanbuff_ex
cl_pretcode
clam_scan_buffer
clam_scan_file
clam_get_version

치명적인 오류: /var/www/clamav.php의 14번째 줄에서 정의되지 않은 함수 confirm_clamav_compiled() 호출

마지막 줄의 치명적인 오류는 무시할 수 있습니다.

이제 어떤 함수가 사용 가능한지 알았지만, 어떤 매개변수가 필요한지는 알지 못합니다. http://www.clamav.net/doc/0.88.4/html/node41.html에서 ClamAV의 소스 코드에 있는 유사한 함수를 설명하는 페이지를 찾았습니다. 테스트와 그 페이지를 읽으면서 cl_info(), cl_scanfile(), cl_setlimits(), clam_get_version() 함수를 사용하는 방법을 알아냈습니다. 이는 업로드된 파일을 검사하는 데 필요한 모든 함수입니다(사실 cl_scanfile()만 필요합니다). 다음 장에서는 작은 HTML 업로드 양식을 만들고 이러한 함수를 사용하여 업로드된 파일을 바이러스 검사하는 방법을 설명합니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.