Динамически работающий ClamAV Clamscan при загрузке файлов с помощью PHP
Стек,
Я хочу сканировать каждый файл, который загружается через мой скрипт загрузки php, с помощью инструмента clamscan антивируса clam. Я думаю, что у меня написан хороший сценарий, но я хотел его запустить, ребята.
Итак, если предположить, что файл, который я отправляю в этот скрипт загрузки php, называется "uploadedfile", имеет ли смысл следующий код?
<?php
$safe_path = escapeshellarg('/tmp/' . $_FILES['uploadedfile']['tmp_name']);
$command = 'clamscan ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);
if ($int == 0) {
// all good, code goes here uploads file as normal IE move to
permanent directory etc;
} else {
unlink('/tmp/' . $_FILES['uploadedfile']['tmp_name']);
header(Location: http://www.domain.com/uploadform.php?error=your-file-was-infected-pal);
}
?>
Кроме того, будет ли clamscan находить php-оболочки, а также традиционные старые добрые вредоносные программы?
Спасибо!
Обновление - нашел ответ
Я ответил на свой вопрос, но не имею репутации официально делать это. Вот ансер:
Для тех, кто придет после. Я протестировал этот скрипт с помощью файла EICAR test http://eicar.org/86-0-Intended-use.html и после нескольких настроек он заработал. Возвращаемая переменная $int говорит о том, что файл безопасен или нет. Если $int равно 0, вирус не найден, если $int равен 1, вирус найден. Однако есть некоторые изменения, которые я должен был заставить скрипт работать (я обновил переменную $safe_path, чтобы она была правильной), вот рабочий скрипт:
<?php
$safe_path = escapeshellarg($_FILES['uploadedfile']['tmp_name']);
$command = 'clamscan ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);
if ($int == 0) {
// all good, code goes here uploads file as normal IE move to
permanent directory etc;
} else {
//whatever you need to do if a virus is found.
}
?>
2 ответа
Обратите внимание, что если на вашем сервере запущен демон clamav (clamd), возможно, можно будет использовать clamdscan вместо clamscan, как предлагается, это использование происходит быстрее, поскольку используются сигнатуры вирусов, уже загруженные clamd.
Просто будь осторожен. Если ваш clamscan устареет, вы получите отзыв в выводе:
Это будет выглядеть так:
LibClamAV Warning: ***********************************************************
LibClamAV Warning: *** This version of the ClamAV engine is outdated. ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
Также, в зависимости от версии clamscan, "результат" может выглядеть следующим образом (и вам нужно будет проанализировать его соответствующим образом):
[filename]: OK
----------- SCAN SUMMARY -----------
Known viruses: x
Engine version: x.x.x
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: x.xx MB
Data read: x.xx MB (ratio 0.00:1)
Time: x.xx sec (0 m x s)
У меня было много проблем с разрешениями при попытке запустить это с помощью clamdscan. Я нашел решение проблемы с разрешениями здесь: https://wiki.archlinux.org/index.php/ClamAV
Это изменило эту строку:
$command = 'clamscan ' . $safe_path;
кому:
$command = 'clamdscan --fdpass ' . $safe_path;
Похоже, успешно передал хороший файл и пометил файл EICAR.