#php #security #file-upload
#php #Безопасность #загрузка файлов
Вопрос:
Стек,
Я хочу сканировать каждый файл, который загружается с помощью моего скрипта загрузки php, с помощью clamscan от clam anti-virus. Я думаю, что у меня написан хороший скрипт, но я хотел запустить его мимо вас, ребята.
Итак, предполагая, что файл, который я отправляю в этот скрипт загрузки 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 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.
}
?>
Комментарии:
1. Спасибо, что поделились этим!
2. Специальный голос за
escapeshellarg
. Многие разработчики забывают об этом, и это чрезвычайно важно — разработчики с учетом безопасности должны исключать возможность выполнения произвольного кода с помощью таких вещей, какexec
.
Ответ №1:
Обратите внимание, что если на вашем сервере запущен демон clamav (clamd), возможно, можно использовать clamdscan вместо clamscan, как предлагается, это использование быстрее, поскольку использует сигнатуры вирусов, уже загруженные clamd.
Комментарии:
1. Этот ответ был бомбой замедленного действия 😉 Да, это на самом деле то, что я в итоге использовал. запуск clamscan занял около 5-6 секунд, clamdscan работает практически мгновенно.
2. Кроме того, я обнаружил, что прямое открытие сокет-соединения с clamd приводило к несогласованному выводу (ClamAV v0.98.4 на Solaris Sparc) при рекурсивном сканировании каталогов. Использование двоичного файла clamdscan срабатывало каждый раз.
3. Спасибо!! серьезно полезно 🙂
4. Примечание: если вы используете
clamd
, у пользователя, который запускаетclamd
, должно быть разрешение на файл, который вы хотите сканировать.
Ответ №2:
Просто будьте осторожны. Если ваш 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)
Комментарии:
1. Я запустил скрипт, используя обычный image.jpg файл и файл eicar test virus, а также возвращаемое значение $int будут возвращены как 0, если файл безопасен, и 1, если файл заражен. На этом я основываю остальные действия скрипта.
2. В этом случае это выглядит хорошо. Просто не забывайте обновлять свои определения. Если вы хотите протестировать какой-либо код оболочки, просто загрузите пару отсюда exploit-db.com/search /…
Ответ №3:
У меня было много проблем с разрешениями при попытке запустить это с помощью clamdscan. Я нашел решение проблемы с разрешениями здесь: https://wiki .archlinux.org/index.php/ClamAV
Это изменило эту строку:
$command = 'clamscan ' . $safe_path;
Для:
$command = 'clamdscan --fdpass ' . $safe_path;
Похоже, успешно передал хороший файл и пометил файл EICAR.