Вирусы и безопасность · 4 min read · Dec 07, 2025
Как автоматически сканировать загруженные файлы на вирусы с помощью php-clamavlib - Страница 2
5 Небольшой пример
Теперь мы создадим небольшой скрипт загрузки, /var/www/upload.php, который содержит HTML-форму загрузки. Если вы отправите форму, скрипт вызовет сам себя и использует 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: длинное целочисленное значение / архивные файлы больше этого значения (в байтах) не будут сканироваться /
В основном, эти значения определяют поведение ClamAV, если архивы (zip-файлы, tar.gz-файлы, bz2-файлы и т.д.) сканируются. Если вы не используете функцию 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 в вашем браузере. Вы должны увидеть это:

Нажмите на Обзор… и выберите файл для загрузки с вашего жесткого диска (файл, который не является вирусом и не больше 2 МБ - это максимальный размер загрузки по умолчанию, который снова можно изменить в вашем 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
Get new posts in your inbox
No spam. Unsubscribe anytime.