powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / API для программной интеграции с антивирусом
6 сообщений из 6, страница 1 из 1
API для программной интеграции с антивирусом
    #39038960
Dony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У нас есть портал, в процессе бизнес процесса, принимает файлы от пользователей.
Необходимо проверять файлы на вирусы.
Для этого хотим создать локальный антивирусный ресурс (например, web service).
Существует ли API для программной интеграции с антивирусом.
Хотелось бы чтобы антивирусный ресурс работал очень очень очень быстро т.к. файлов много.
Не важно метод интеграции (soap, rpc, http и т.д.), главное чтобы не экзотический.
Может быть, существует Apache модуль типа mod_антивирус,
желательно антивирус McAfee или Kaspersky, DrWeb или чтото известное (на слуху у начальства) не экзотическое.
Запуск проверки файла с командной строки, не подходит т.к. такой вариант работает очень долго.
Формирование очереди для проверки файлов, не желательно.

Приведу пример предполагаемой интеграции.

-- клиент (веб браузер)
c html страницы, загружает файл на web server.
так <form> с <input type=file>

-- веб сервер (на php)
принимает файл от клиента.
затем, формирует SOAP запрос на антивирусный web service
примерно так, на php, $client = new SoapClient("антивирус.wsdl");
(или просто формирует http post запрос с прикрепленным файлом)

-- антивирусный ресурс (linux, web service)
принимает запрос (soap, post или както).
проверяет файл на вирусы.
выдает ответ о отсутствии вируса или наличии с указанием наименования вируса.
...
Рейтинг: 0 / 0
API для программной интеграции с антивирусом
    #39045178
Dony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
антивир ClamAV.
имеет демон clamd.
clamd принимает команды на TCP или UNIX сокете.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
-- установка ClamAV
apt-get install clamav
apt-get install clamav-daemon

-- конфиг
/etc/clamav/clamd.conf 
   TCPSocket 3310
   TCPAddr 127.0.0.1


-- стоп старт статус
/etc/init.d/clamav-daemon stop
/etc/init.d/clamav-daemon start
/etc/init.d/clamav-daemon status

-- просмотрт процессов антвируса
ps axj|grep clam|grep -v grep
ps aux|grep clam|grep -v grep

-- сетевые соединения
lsof -i :3310

-- просмотрт сокетов
netstat -a|grep clam

-- лог файл
/var/log/clamav/clamav.log





Пример использования

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?php
  if (isset($_FILES['fail'])){
    $fn   = $_FILES['fail']['name'];
    $tfn  = $_FILES['fail']['tmp_name'];
    $size = $_FILES['fail']['size'];
    echo "name=[$fn] tmp_name=[$tfn] size=[$size]<br>\n";
    if (empty($tfn)){
       echo "<span style='color:red'>no file</span>\n";
    }else{
       include 'clamd.php';
       $clamd = new ClamdPipe();
       // $clamd = new ClamdNetwork();
       // print_r($clamd);
       $p = $clamd->ping();
       echo "ping ".(($p)?'yes':'no')."<br>\n";
       $ver = $clamd->version();
       echo "version [$ver]<br>\n";
       $fs = $clamd->fileScan($tfn);
       echo "<pre style='color:red'>\n";
       print_r($fs);
       echo "</pre>\n";
       echo "<br>\n";
    }
  }
?>
<body>
  <form method=post enctype="multipart/form-data">
    <br><br>
    <input type=file name=fail><br><br>
    <input type=submit><br><br>
  </form>
</body>




файл clamd.php

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
<?php

/* clamd.php v0.1 ClamAV daemon interface.
 *
 * Author  : Barakat S. <b4r4k47@hotmail.com>;
 * Licence : MIT
 */

define('CLAMD_PIPE', '/var/run/clamav/clamd.ctl');
define('CLAMD_HOST', '127.0.0.1');
// define('CLAMD_HOST', '192.168.0.45');
define('CLAMD_PORT', 3310);
define('CLAMD_MAXP', 20000);

/* EICAR is a simple test for AV scanners, see: https://en.wikipedia.org/wiki/EICAR_test_file */
// $EICAR_TEST = 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*';


/* An abstract class that `ClamdPipe` and `ClamdNetwork` will inherit. */
abstract class ClamdBase {
    
    abstract protected function getSocket();

    /* Send command to Clamd */
    private function sendCommand($command)
    {
        // echo "-- ".__method__." <br>\n";
        $return = null;
        echo "command [$command] <br>\n";

        $socket = $this->getSocket();
        socket_send($socket, $command, strlen($command), 0);
        socket_recv($socket, $return, CLAMD_MAXP, 0);
        socket_close($socket);

        echo "return [$return] <br>\n";

        return $return;
    }
    
    /* `ping` command is used to see whether Clamd is alive or not */
    public function ping() {
        $return = $this->sendCommand('PING');
        return strcmp($return, 'PONG') ? true : false;
    }

    /* `version` is used to receive the version of Clamd */
    public function version() {
        return trim($this->sendCommand('VERSION'));
    }

    /* `reload` Reload Clamd */
    public function reload() {
        return $this->sendCommand('RELOAD');
    }

    /* `shutdown` Shutdown Clamd */
    public function shutdown() {
        return $this->sendCommand('SHUTDOWN');
    }

    /* `fileScan` is used to scan single file. */
    public function fileScan($file) {
        list($file, $stats) = explode(':', $this->sendCommand('SCAN ' .  $file));

        return array( 'file' => $file, 'stats' => trim($stats));
    }

    /* `continueScan` is used to scan multiple files/directories.  */
    public function continueScan($file) {
        $return = array();
        
        foreach( explode("\n", trim($this->sendCommand('CONTSCAN ' .  $file))) as $results ) {
            list($file, $stats) = explode(':', $results);
            array_push($return, array( 'file' => $file, 'stats' => trim($stats) ));
        }
        return $return;
    }
    
    /* `streamScan` is used to scan a buffer. */
    public function streamScan($buffer) {
        $port    = null;
        $socket  = null;
        $command = 'STREAM';
        $return  = null;
  
        $socket = $this->getSocket();
        socket_send($socket, $command, strlen($command), 0);
        socket_recv($socket, $return, CLAMD_MAXP, 0);

        sscanf($return, 'PORT %d\n', $port);

        $stream = socket_create(AF_INET, SOCK_STREAM, 0);
        socket_connect($stream, CLAMD_HOST, $port);
        socket_send($stream, $buffer, strlen($buffer), 0);
        socket_close($stream);
        
        socket_recv($socket, $return, CLAMD_MAXP, 0);

        socket_close($socket);
  
        return array('stats' => trim(str_replace('stream: ', '', $return)));
    }
}

/* This class can be used to connect to local socket, the default */
class ClamdPipe extends ClamdBase {
    private $pip;

    /* You need to pass the path to the socket pipe */
    public function __construct($pip=CLAMD_PIPE) {
        $this->pip = $pip;
        echo "<br>Pipe {$this->pip}<br>\n";
    }

    protected function getSocket() {
        $socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
        socket_connect($socket, $this->pip);
        return $socket;
    }
}


/* This class can be used to connect to Clamd running over the network */
class ClamdNetwork extends ClamdBase {
    private $host;
    private $port;

    /* You need to pass the host address and the port the the server */
    public function __construct($host=CLAMD_HOST, $port=CLAMD_PORT) {
        $this->host = $host;
        $this->port = $port;
        echo "<br>Network {$this->host} {$this->port}<br>\n";
    }

    protected function getSocket() {
        echo "<br>\n".__method__."<br>\n";
        $socket = socket_create(AF_INET, SOCK_STREAM, 0);
        // echo "<br>\n".print_r($socket,true)."<br>\n";
        $x = socket_connect($socket, $this->host, $this->port);
        if ($x===false){
          $err_code = socket_last_error();
          $err_text = socket_strerror($err_code);
          echo "Unable to connect [$err_code] [$err_text]<br>\n";
        }

        // echo "<br>\n".print_r($socket,true)."<br>\n";
        return $socket;
    }
}

?>




можно проверить наличие вируса создав txt файл с таким содержимым
Код: sql
1.
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
...
Рейтинг: 0 / 0
API для программной интеграции с антивирусом
    #39045182
Dony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хорош ClamAV, но начальство о нем не знает..
у них на слуху McAfee, Kaspersky, DrWeb и т.д.
Есть ли чтото подобное у "известных" антивирусов?

гдето мельком слышал о kavdaemon
...
Рейтинг: 0 / 0
API для программной интеграции с антивирусом
    #39046320
ShkrylAndrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем вас стандартный антивирус не устраивает, профессиональные антивирусы фильтруют входной поток информации. К тому же не кажется ли вам что вы изобретаете телегу, файлы от пользователей какого-то одного формата, наверное текстовые. Зачем их проверять на вирус? Вы куда их сохраняете в каталог или базу? Если в каталог, то любой антивирус их проверит в автоматическом режиме.
...
Рейтинг: 0 / 0
API для программной интеграции с антивирусом
    #39056482
Dony
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShkrylAndreiА чем вас стандартный антивирус не устраивает, профессиональные антивирусы фильтруют входной поток информации. К тому же не кажется ли вам что вы изобретаете телегу, файлы от пользователей какого-то одного формата, наверное текстовые. Зачем их проверять на вирус? Вы куда их сохраняете в каталог или базу? Если в каталог, то любой антивирус их проверит в автоматическом режиме.
стандартный не устраивает тем что проверяет файл относительно долго, т.к. тратится время на запуск и инициализацию.
Вы о каком входном потоке говорите?, нам надо программно получить результат проверки файла.
Файлы от пользователей могут быть любые. Проверять на вирусы надо.
Куда сохрняем, не важно, нам надо проверить файл на самом раннем этапе, до сохранения. На уровне или совсем рядом http запроса.
Мне кажется Вы не поняли суть задачи.
Спасибо за совет с телегой, учту.
...
Рейтинг: 0 / 0
API для программной интеграции с антивирусом
    #39056543
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
mv clamav.log drweb.log



и внутри тоже слова подправить регулярно выразительно.

потом показать начальству.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / API для программной интеграции с антивирусом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]