sábado, 7 de janeiro de 2012

ClamAV como um filtro de validação em Zend Framework


Ok, então você está muito confortável com o uso do Zend Framework, especificamente o uso de formulários. Junto com isso, você tem um bom conhecimento de como combinar uma série de validadores padrão , tais como CreditCard , EmailAddress , Db_RecordExists e Hex , e filtros padrão , como compactar / descompactar , basename , Encrypt e realpath . Mas o que você faz quando surge uma situação que está fora do escopo dos validadores pré-embalados e filtros?

Digamos que você queira se proteger contra arquivos carregar utilizadores que contenham vírus, por exemplo. Você teria que escrever um validador personalizado que verifica os uploads não estão infectados. Hoje vou mostrar-lhe como fazer exatamente isso - como escrever um filtro de arquivo para nova validação do Zend Framework que usa o ClamAV para garantir que os arquivos enviados são livres de vírus.




Adicionando suporte a PHP ClamAV
Primeiro você vai precisar instalar o suporte ClamAV. Estou baseando este procedimento de instalação em torno de Linux, especificamente Ubuntu. Se você estiver usando outra distribuição, você pode precisar de ajustar os comandos de acordo. Infelizmente, se você estiver usando o Windows no entanto, você precisa usar um aparelho baseado em Linux Virtual ou configurar uma máquina virtual rodando Linux para acompanhar desde a extensão php-clamav não suporta o Windows ainda.

Antes de tentar instalar o ClamAV, garantir que você tenha dependências da biblioteca instalada. Você também vai querer ter certeza de que o pacote PHP dev instalado de forma phpize está disponível. Você pode fazer isso executando o seguinte comando:

msetter @ tango: ~ $ sudo apt-get install php5-dev-dev libclamav libclamav6 clamav clamav-freshclam
Depois de ter instalado as dependências, pegue uma cópia da biblioteca php-clamav a partir sourceforge.net / projects / php-clamav e extraí-lo para um diretório temporário no seu sistema. Navegue para o diretório da biblioteca extraído e execute os seguintes comandos:

msetter @ tango: ~ / php-clamav $ phpize
msetter @ tango: ~ / php-clamav $ / configure - with-clamav.
msetter @ tango: ~ / php-clamav $ fazer

Se todos eles executaram sem erros, você encontrará um módulo recém-compilados no subdiretório modules. Copie o módulo para o diretório no qual o resto de seus módulos PHP reside. Seu sistema pode variar, mas eu era capaz de fazê-lo com:

msetter @ tango: ~ / php-clamav $ sudo cp modules / clamav.so / usr/lib/php5/20090626 + lfs /
Então você precisa para ativar o módulo no arquivo de configuração do PHP. Isto é feito muito simplesmente adicionando a seguinte linha no php.ini e reiniciar o Apache:
extension = clamav.so
Por fim, seja executar php-i na linha de comando ou executar um script PHP simples que contém apenas uma chamada para phpinfo () para verificar a nova extensão está habilitada. Você deverá ver uma saída semelhante à abaixo.

A biblioteca ClamAV vem com uma série de constantes e funções, mas neste artigo vou me concentrar em apenas duas funções, cl_scanfile () e cl_pretcode () , como tudo que você precisa fazer é digitalizar o arquivo enviado e relatar o que o vírus está se um foi encontrado. Para mais informações sobre as outras funções disponíveis visita php-clamav.sourceforge.net .

Construindo o File Upload Validator
Agora que a extensão é instalado e ativado, vamos em curso e construir o Zend Framework arquivo ClamAV carregar validador. Eu vou assumir que você já tem um projeto Framework Zend de trabalho que tem suporte ao módulo ativado e pronto para ir. Adicionar suporte para a biblioteca nova validação, adicionando a seguinte linha ao seu application.ini arquivo:

autoloaderNamespaces [] = "Common_"
Então, sob o diretório da biblioteca de sua raiz do projeto Zend Framework, crie o diretório comum / Validate / File e dentro dela um arquivo chamado ClamAv.php com o seguinte conteúdo:

<? Php
classe Common_Validate_File_ClamAv estende Zend_Validate_Abstract
{
}

Com isso, sua classe novo validador estará disponível para o projeto.
Se você não estiver familiarizado com os validadores em Zend Framework, eles são um assunto muito straight-forward. Você pode estendê-los a partir Zend_Validate_Abstract ou Zend_Validate_Interface .

Para efeitos deste exemplo, eu estou baseando o validador no anterior. Dado que, você só terá que implementar dois métodos: o construtor e isValid () .
O construtor deve verificar se a extensão ClamAV é carregado como não é fornecido com uma distribuição padrão do PHP.

O isValid () método irá realizar o trabalho do núcleo do validador. Normalmente, o método valida alguma entrada e retorna true se a validação foi bem sucedida ou define uma mensagem de erro na lista de erros que é exibido depois e retorna false se a validação falhou. Dependendo da configuração de validadores seu formulário, retornando falso ou deter a validação de formulário em que ponto ou deixe-os validadores restantes continuam a ser executado.
Preencha o Common_Validate_File_ClamAv classe para que ele se parece com isso:

<? Php
classe Common_Validate_File_ClamAv estende Zend_Validate_Abstract
{
    const STATUS_CLEAN = 0;
    const NOT_READABLE = "fileNotReadable" ;
    const FILE_INFECTED = "fileInfected" ;

    protegidos $ _messageTemplates = matriz (
        self:: FILE_INFECTED => "'% valor%' File está infectado" ,
        self:: NOT_READABLE => "'% valor%' Arquivo não é legível" );

    público da função __construct () {
        se (! extension_loaded ( 'clamav' )) {
            throw novo Zend_Validate_Exception (
                "Extensão ClamAV não é carregado" );
        }
    }

    público função isValid ( $ value , $ file = null) {
        se ( $ file === null) {
            $ File = matriz ( "tipo" = null>, "nome" => $ value );
        }

        se (Zend_Loader:: isReadable ( $ value )) {
            retornar $ this -> _throw ( $ file self,:: NOT_READABLE);
        }

        $ Retcode cl_scanfile = ( $ value , $ virusname );
        se ( $ retcode auto ==:: STATUS_CLEAN) {
            printf ( "Caminho do arquivo:% s | Código de retorno:% s | nome de vírus encontrado:% s" ,
                $ Value , cl_pretcode ( retcode $ ), $ virusname );
            retornar $ this -> _throw ( $ file self,:: FILE_INFECTED);
        }

        retornar true;
    }

    protegidos função _throw ( $ file , $ errorType )
    {
        $ This -> _value = $ arquivo [ "name" ];
        $ This -> _error ( $ errorType );
        retornar false;
    }
}

Primeiro, um conjunto de constantes de classe são especificados que definem o status de retorno para o vírus modelos string para verificar mensagens personalizadas erros. Depois disso, o construtor verifica o suporte ClamAV está disponível. Se ele não está disponível, então uma exceção é lançada.
O isValid () método verifica se a entrada no valor de $ argumento contém um nome de arquivo e que o arquivo é legível. Se for, então o cl_scanfile () função é chamada. O código de retorno do cl_scanfile () indica se o arquivo está livre de vírus. Se não, então o nome do vírus é recuperado usando o cl_pretcode () função e as informações são impressas.

O _throw () método se encarrega de definir o erro apropriado constante na classe e retornando false para indicar que a validação falhou. Se isso acontecer, a mensagem de erro relacionadas com a constante será exibido no formulário de envio através do uso de um decorador de erro sobre o elemento de entrada.

Testando o Validator
Com o validador escrito, você precisará de um formulário para fazer uso dele e testar se funciona. Manualmente ou com zf.sh , criar uma nova ação na IndexController classe do módulo padrão e chamar-lhe "fileUpload". Adicione o seguinte código a ele:

<? Php
classe IndexController estende Zend_Controller_Action
{
...

    público função fileUploadAction () {
        $ Form = nova Zend_Form ();
        $ Form -> setAction ( "default / / index / file-upload" )
             -> SetMethod ( "post" );

        $ UploadFile = nova Zend_Form_Element_File ( "uploadfile" );
        $ UploadFile -> addValidator ( nova Common_Validate_File_ClamAv ())
           -> SetRequired (true)
           -> SetLabel ( "Upload file:" );

        $ Form -> addElement ( $ uploadFile );
        $ Form -> addElement ( nova Zend_Form_Element_Submit ( "submit" ));

        se ( $ form -> isValid ( $ _POST )) {
            $ Valores = $ form -> getValues ​​();
            $ This -> view-> mensagens = matriz ( "Arquivo carregado" );
        }

        $ This -> view-> form = $ form ;
    }
}

Aqui você criou um formulário simples e definir sua ação e propriedades método, um botão de envio, e um elemento do arquivo. O recém-criado ClamAV arquivo validador é adicionado ao elemento do arquivo. Além disso, a bandeira necessária é definida como verdadeira garantia de que um arquivo deve ser carregado. Depois disso, ambos os elementos são adicionados ao formulário e uma simples instrução if verifica se o formulário foi submetido.
Se o formulário não validar após serem submetidos (ou seja, o arquivo tem um vírus), então uma mensagem de validação será exibido usando o decorador de mensagem padrão de erro. Caso contrário, uma mensagem é adicionado às mensagens da visão que será exibido para o usuário para indicar o upload foi bem sucedido.

A última peça é o script de visualização, que é mostrado abaixo:
exibição da fonteprint ?

<h1> Zend Framework - ClamAV File Upload Validator </ h1>

<? Php
se ( count ( $ this -> mensagem)) {
    echo "<ul id="messages"> ' ;
    foreach ( $ this -> mensagens como $ message ) {
        echo "<li>" . $ this -> escape ( $ message ). "</ li>" ;
    }
    echo "</ ul>" ;
}
echo $ this - form>;

Como a parte do leão do trabalho já tomado cuidado pelo controlador eo validador, o script de visualização não precisa fazer muita coisa. Ele simplesmente exibe as mensagens que foram definidas pelo controlador e torna o formulário.

Nenhum comentário :

Postar um comentário

Total de visualizações de página