-1

Atualizando o Anti-Vírus no Linux com PHP

criado por Alexandre Strube em 28/04/2002 11:38pm
A primeira função do programa chama-se verificaversao(). Ela apenas entra no ftp da nai.com e lista qual é o dat mais recente. Repare no uso do flush() para enviar as mensagens imediatamente para o browser.

Na versão que eu uso atualmente, preciso do tipo pois além do dat em formato ZIP, eu baixo as versões .exe e SDAT.exe (que inclui o engine novo para o Windows), por causa dos clientes. Essencialmente, a diferença são os diretórios no servidor FTP da nai.com onde encontram-se estes arquivos.

<?php
function verificaversao($tipo)
{
    echo("Conectando ao servidor ftp.nai.com. Aguarde....<BR>");
    flush();
    $conn_id=ftp_connect("ftp.nai.com");
    if ($conn_id) {
        echo("Conectado. Enviando login e senha..<BR>");
        flush();
        $login_result=ftp_login($conn_id,"anonymous","guest@");	
        if ($login_result) {
            echo("Entrou. Mudando diretorio...<BR>");
            flush();
            if ($tipo=="zip") { 
                if(ftp_chdir($conn_id,"/pub/datfiles/english")) {
                    echo ("Entrou. Procurando vers&atilde;o mais nova do antivirus... <BR>");
                    flush();
                    $fnaam=ftp_nlist($conn_id,"*.zip"); 
                    echo("A versao l&aacute; no site da <U>NAI</U> &eacute a <font color=#FF0000>$fnaam[0]</FONT><BR>");
                    echo("Deseja baixar esta vers&atilde;o e atualizar o sistema?<BR>");
                    echo("<A HREF=\"$PHP_SELF?downloadarquivo&tipo=zip&arquivo=$fnaam[0]\>SIM</A> &nbsp; <A HREF=\"www.cade.com.br\">N&Atilde;O</A>");
                    ftp_quit($conn_id);	
                    echo("</PRE><br><br><A HREF=\"$PHP_SELF\">Voltar para a primeira tela</a>");
                }
            }
        } else {
            echo("Nao deu login.");
            ftp_quit($conn_id);
        }
    } else {
        echo("Nao conectou.");
        ftp_quit($conn_id);
    }
}
?>

O que a função fez? Abriu uma conexão ftp, entrou no diretório certo e, usando a função ftp_nlist, listou os arquivos da pasta atual. Como eu sei que sempre vai ter apenas um arquivo nesta pasta, não me preocupei com isso. Esta funcão chama uma outra função chamada downloadarquivo, que segue:

<?php
function downloadarquivo($tipo, $arquivo)
{
    echo("Ok. Vou entao pegar o arquivo.<BR>");
    flush();
    $conn_id=ftp_connect("ftp.nai.com");
    if ($conn_id) {
        echo("Conectado. Enviando login e senha..<BR>");
        flush();
        $login_result=ftp_login($conn_id,"anonymous","guest@");
        if ($login_result) {
            echo("Entrou. Mudando diretorio...<BR>");
            flush();
            if ($tipo=="zip") {
                if (ftp_chdir($conn_id,"/pub/datfiles/english")) {
                    echo("Vers&atilde;o atual do antivirus:<BR>\n<PRE>");
                    passthru("/usr/local/uvscan/uvscan --version");
                    echo ("</PRE>Entrou. Baixando o arquivo $arquivo... Isso pode demorar! (E sim, a p&aacute;gina fica travada chamando sim) >:-)  <BR>");
                    flush();
                    if (ftp_get($conn_id,"/usr/local/uvscan/$arquivo","$arquivo",FTP_BINARY)) {
                        echo("Baixou!<BR>");
                    }
                    ftp_quit($conn_id);
                    echo("Agora vou descompactar essa engronha<BR>\n<PRE>");
                    passthru("/usr/local/uvscan/unzipa.sh $arquivo");
                    echo("\n\n");
                    passthru("/usr/local/uvscan/uvscan --version");
                    echo("Vou agora copiar o $arquivo para o ftp \n");
                    passthru("cp /usr/local/uvscan/$arquivo /var/ftp/dats/");
                    mail("cretino@hotmail.com", "Atualizado o dat zipado para $arquivo","O arquivo $arquivo foi 
baixado agora. Alem deste email estou enviando outro com virus para testar. Se ele chegar e' 
porque o amavis nao esta funcionando corretamente.", "Priority: High\nX-Priority: 1\nFrom: cretino@hotmail.com\nReply-To: cretino@hotmail.com");
                    mail("suporte@barroco.com.br","VIRUS","--__attach\nContent-Type: text/plain; charset=\"iso-8859-1\"\nContent-Transfer-Encoding: 7bit\nEste email contem o arquivo EICAR.com de teste. Se ele chegou o amavis nao esta escanando os virus. Sugiro mudar para o dat anterior urgente. Ele esta' em /usr/local/uvscan - assim como todo o antivirus.\n\n--__attach\nContent-Type: application/octet-stream; name=\"eicar.com\"\nContent-Transfer-Encoding: base64\n\nWDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNU\nLUZJTEUhJEgrSCo=\n\n--__attach\n","Return-Path: <cretino@hotmail.com>\nFrom: cretino@hotmail.com\nReply-To: cretino@hotmail.com\nX-Priority: 1\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"__attach\"\n");
                    setlocale("LC_ALL","pt_BR");
                    $arquivozip=fopen("/var/www/zip.inc","w+");
                    fwrite($arquivozip, '<?php
$urlzip="ftp://ftp.teste.com/ftp/dats/'.$arquivo.'";
$diazip="'.date("d/m/Y",time()).'";
$tamanhozip="'.floor(filesize("/var/ftp/dats/$arquivo")/1024).' k";
?>');
                    echo("</PRE><br><br><A HREF=\"www.cade.com.br\">Sair</a>");
                }
            }
        } else {
            echo("Nao deu login.");
            ftp_quit($conn_id);
        }
    } else {
        echo("Nao deu conexao.");
        ftp_quit($conn_id);
    }
}
?>

Esta funcao fez o que? Bem, ela conectou-se ao servidor FTP, baixou o arquivo, jogando-o diretamente dentro da pasta scan. Logo após isso, ele chama um script de nome unzipa.sh responsável por unzipar o arquivo. Devido a algumas restricoes, nao sou capaz de fazer isto eu meu servidor diretamente via php, portanto fiz via shell. O comando passthru é o responsavel por executar um comando qualquer do unix. Repare que logo após isso, copio o arquivo recém-baixado para a pasta do ftp.

Segue o script unzipa.sh (que deve ser do usuário nobody e estar dentro do diretório do uvscan)

cd /usr/local/uvscan
unzip -L -o ./$1

Nada demais, não é? Estas alterações são aplicadas em um servidor que não pode ser parado toda vez que inventam um vírus. O uvscan não se incomoda com isso, e pode ser alterado com o qmail rodando.

Logo após ter copiado o arquivo para o meu ftp, o script envia automaticamente dois e-mails para o usuário cretino@hotmail.com - um avisando que o antivírus foi atualizado, e outra contendo o arquivo de teste EICAR.com. Se o segundo arquivo chegar, é porque o servidor não está verificando contra vírus os e-mails, portanto voce jamais deve ver esse email em sua caixa postal >:-)

Como alguns raros usuários meus atualizam seus próprios antivírus, o script incorpora mais uma gentileza: joga para um arquivo chamado zip.inc, dentro do diretório www, informações sobre este arquivo. Estas são incluídas na página de download das atualizações, desta forma esta página está sempre com a última versão sem eu precisar alterá-la tambem (salva um tempo...)

Um exemplo desta página é:

<?php @include "zip.inc"; ?>
<a href="<?php echo $urlzip; ?>">Atualizacao do scan ( <?php echo $diazip; ?> ) - Arquivo compactado</a><br>
Tamanho: <?php echo $tamanhozip; ?>

Simples, não?

Bem, é isso. Quaisquer dúvidas, favor mandar e-mail.

Comentários:

Mostrando 1 - 2 de 2 comentários
concordo com o é!!!
13/09/2003 6:24am (~20 anos atrás)

Devido ao fato do e-mail enviado por esta funcao ser extremamente rudimentar, o spamassassin ( http://www.spamassassin.org )pode considera-lo spam caso a nota de corte esteja muito baixa e nao entrega-lo...
15/05/2002 6:45pm (~22 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)