바이러스 검사 · 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 업로드 양식을 만들고 이러한 함수를 사용하여 업로드된 파일을 바이러스 검사하는 방법을 설명합니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.