sexta-feira, 23 de setembro de 2011

Uploads de arquivos com PHP


O que fazer fotos em um álbum de fotos online, anexos de email em um cliente de email baseado na Web, e arquivos de dados submetidos a uma aplicação online para processamento em lote têm em comum? Todos eles contam com a capacidade de upload de arquivos através da Internet a partir do browser da Web do usuário. De fato, o upload de arquivos é uma característica importante de muitos dos sites e aplicações baseadas na web que usamos em uma base diária. Neste tutorial, vou mostrar como adicionar suporte para upload de arquivos para o seu site usando PHP.



Requisitos
Gerenciar o upload de arquivos não é difícil, mas há um punhado de pequenos detalhes que devem ser corretas, ou então o upload falhará. Primeiro, você precisa para garantir o PHP é configurado para permitir uploads. Verifique se o seu php.ini arquivo e verificar a file_uploads directiva é definir On .
file_uploads = On


Os arquivos enviados são primeiro armazenados em um diretório temporário (não se preocupe ... o script PHP pode mover os arquivos para um local mais permanente depois). Por padrão, a localização inicial é o diretório padrão do sistema temporário. Você pode especificar um diretório diferente usando o upload_tmp_dir directiva no php.ini . Independentemente disso, você deve verificar o processo de PHP tem os privilégios apropriados para gravar em qualquer diretório é usado.
upload_tmp_dir = "/ tmp"


tboronczyk @ Zarkov: ~ $ ls-l / | grep tmp
drwxrwxrwt root root 13 40960 2011/08/31 00:50 tmp


Depois que você está certo de que a configuração permite que o servidor para aceitar arquivos enviados, você pode concentrar sua atenção nos detalhes HTML. Como a maioria das outras do lado do servidor a partir de interações HTML, upload de arquivos fazem uso de formas. É imperativo que o seu <form> elemento usa o método POST e tem um enctype atributo definido como multipart / form-data .


< forma de ação = "upload.php" método = "post" enctype = "multipart / form-data" >


O processo de upload de scripts
Você provavelmente pode adivinhar o upload de arquivos de fluxo de trabalho passam por base em suas próprias experiências e as verificações exigência que acabei de mencionar.
Um visitante vê uma página HTML com um formulário escrito especificamente para apoiar o upload de arquivos


O visitante fornece o arquivo que ele quer fazer o upload e envia o formulário
O browser codifica o arquivo e envia-lo como parte do pedido POST faz para o servidor
PHP recebe o envio do formulário, o arquivo decodifica e salva-lo em um local temporário no servidor
O script PHP responsável pelo tratamento do pós forma verifica o arquivo e processa-lo de alguma maneira, muitas vezes se deslocam de seu local temporário para uma casa mais permanente
Adicionando suporte para upload de arquivos exige que você criar um formulário HTML para ser apresentado para o usuário e um script PHP para cuidar do arquivo carregado no servidor.


HTML
Formulários HTML fornecer a interface através da qual um usuário inicia um arquivo de upload. Lembre-se, a <form> elemento deve ter seu método atributo definido como pós e seus enctype atributo definido como multipart / form-data . Um arquivo <input> elemento fornece um campo usado para especificar o arquivo que será upload. Como qualquer elemento outra forma, é importante que você fornecer um atributo de nome para que você possa fazer referência a ela no script PHP que processa o formulário.


Aqui está o que a marcação de uma forma básica de upload de arquivo se parece com:


< forma de ação = "upload.php" método = "post" enctype = "multipart / form-data" >
 < input tipo = "file" name = "myFile" />
 < br />
 < input tipo = "submit" valor = "Upload" />
</ formulário >


É importante notar que diferentes navegadores irá processar o campo de arquivo diferente. IE, Firefox, Opera e exibi-lo como um campo de texto com um botão ao lado chamado "Browse" ou "Choose". Safari torna-lo apenas como botão "Escolher Arquivo." Isto não é um problema maior parte do tempo desde que os usuários estão acostumados a como o campo torna no seu navegador de escolha e saber como usá-lo. Ocasionalmente, no entanto, você será confrontado com um cliente ou designer que é inflexível em apresentar-lhe uma certa maneira. A quantidade de CSS e JavaScript, que pode ser aplicado a um campo de arquivo é extremamente limitada por razões de segurança impostas pelos navegadores. Styling o campo do arquivo pode ser difícil. Se a aparência é importante para você, eu recomendo que você verifique Peter-Paul Koch Styling um input type = "file" .


PHP
Informações sobre o upload do arquivo é disponibilizado com o multidimensional _FILES $ array. Esta matriz é indexada pelos nomes atribuídos aos campos de arquivos no formato HTML, assim como a forma como $ _GET e $ _POST são indexados. Disposição de cada arquivo, em seguida, contém os seguintes índices:


$ _FILES ["MyFile"] ["name"] armazena o nome do arquivo original do cliente
$ _FILES ["MyFile"] ["type"] lojas mime-type do arquivo
$ _FILES ["MyFile"] ["size"] armazena o tamanho do arquivo (em bytes)
$ _FILES ["MyFile"] ["tmp_name"] armazena o nome do arquivo temporário
$ _FILES ["MyFile"] ["error"] armazena qualquer código de erro resultante da transferência


O move_uploaded_file () função move um arquivo carregado a partir de sua localização temporária para permanente. Você deve sempre usar move_uploaded_file () mais funções como copy () e rename () para esta finalidade, pois realiza verificações adicionais para garantir que o arquivo foi realmente enviado pelo pedido POST HTTP.


Se você planeja sobre como salvar um arquivo com o nome original do arquivo fornecido pelo usuário, é uma boa idéia ter certeza que é seguro fazê-lo. O nome do arquivo não deve conter quaisquer caracteres, que podem afetar o caminho de destino, como uma barra. O nome não deve causar o arquivo para substituir um arquivo existente com o mesmo nome, seja (a menos que isso é o que sua aplicação é projetado para fazer). Eu garantir um nome de arquivo seguro, substituindo todos os caracteres com um sublinhado que não são uma letra, número, ou um membro de um muito restrito conjunto de pontuação, e em seguida, acrescentar um número incrementado quando um arquivo com esse nome já existe.
Aqui está o que receber e processar um arquivo de upload com PHP é semelhante a:


<? Php
define ( "upload_dir" , "/ var / www / uploads /" );

se (! vazia ( $ _FILES [ "myFile" ])) {
    MyFile $ = $ _FILES [ "myFile" ];


    se ( $ myFile [ "error" ]! == UPLOAD_ERR_OK) {
        echo "Ocorreu um erro <p> </ p>." ;
        saída ;
    }

    / / Assegura que um nome de arquivo seguro
    $ Nome = preg_replace ( "/ [^ A-Z0-9._-] / i" , "_" , $ myFile [ "name" ]);


    / / Não substituir um arquivo existente
    $ I = 0;
    Partes $ = pathinfo ( $ name );
    enquanto ( file_exists (upload_dir. $ name )) {
        $ I + +;
        $ Name = $ partes [ "nome_do_arquivo" ]. "-" . $ i . "". . $ partes [ "extensão" ];
    }


    / / Preservar arquivo do diretório temporário
    $ Sucesso = move_uploaded_file ( $ myFile [ "tmp_name" ],
        Upload_dir. $ name );
    se (! sucesso $ ) {
        echo "<p> Não foi possível salvar arquivo </ p>." ;
        saída ;
    }


    / / Set permissões adequadas no novo arquivo
    chmod (upload_dir. $ name , 0644);
}


O primeiro código garante que o arquivo enviado sem erros. Em seguida, ele determina um nome de arquivo seguro como acabei de descrever, e então move o arquivo para seu diretório final usando move_uploaded_file () . Finalmente, há uma chamada para chmod () para ter certeza de permissões de acesso sane estão definidas no novo arquivo.


Considerações sobre segurança
A maioria de nós não deixaria completos estranhos armazenar arquivos aleatórios em nossos computadores pessoais, e ainda que é exatamente o que você está fazendo quando você permite o upload de arquivos em nossa aplicação. Você pode ter a intenção de um usuário para fazer upload de uma imagem de si mesmo para uma página de perfil, mas e se ele tenta carregar um especialmente criada, executável vírus-carregado em seu lugar? Eu gostaria de compartilhar algumas etapas que você pode tomar para minimizar os riscos de segurança inerentes ao permitir o upload de arquivos.
Uma delas é verificar o tipo do arquivo enviado é o que deveria ser. Baseando-se quer o valor de $ _FILES ["myFile"] ["type"] ou na extensão do nome do arquivo não é seguro porque ambos podem ser facilmente falsificado. Em vez disso, use uma função como exif_imagetype () para examinar o conteúdo do arquivo e determinar se ele é realmente um GIF, JPEG, ou um de vários outros formatos de imagem suportados. Se exif_imagetype () não está disponível (a função requer a extensão Exif para ser ativado), então você pode usar getimagesize () . A matriz retornada por getimagesize () irá conter o tipo de imagem se ele é reconhecido.


<? Php
/ / Verificar o arquivo é um GIF, JPEG ou PNG
$ FileType = exif_imagetype ( $ _FILE [ "myFile" ] [ "tmp_name" ]);
$ Permitidos = matriz (IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_TIFF_MM);
se (! in_array ( $ fileType , $ permitido )) {
    / / Tipo de arquivo não é permitido
    ...


Para a imagem não-arquivos, você pode usar exec () para invocar o unix arquivo utilitário. arquivo determina o tipo de um arquivo, procurando por assinaturas binário conhecido em locais esperado.


<? Php
/ / Verificar o arquivo é um PDF
$ Mime = "application / pdf; charset = binário" ;
exec ( "file-bi" . $ _FILE [ "myFile" ] [ "tmp_name" ], $ out );
se ( $ out [0]! = $ mime ) {
    / / Arquivo não é um PDF
    ...


Outro passo que você pode tomar é a de impor limites rígidos sobre o tamanho total do pedido POST eo número de arquivos que pode ser carregado. Para isso, especificar um valor apropriado para o upload_max_size , post_max_size e max_file_uploads directivas no php.ini . O upload_max_size directiva especifica o tamanho máximo de upload de um arquivo pode ser. Além do tamanho do upload, você pode limitar o tamanho da solicitação POST inteiro com o post_max_size directiva. max_file_uploads é uma nova directiva (adicionado na versão 5.2.12), que limita o número de uploads de arquivos. Estes três directivas ajudar a proteger seu site contra ataques que tentam atrapalhar a sua disponibilidade, fazendo com que o tráfego de rede pesado ou carga do sistema.
post_max_size = 8M
upload_max_size = 2M
max_file_uploads = 20


Um terceiro passo que você pode tomar para minimizar o risco é verificar os arquivos carregados com um scanner de vírus. Isso é de vital importância neste dia e idade de vírus e malware generalizada, especialmente se o seu site depois faz upload de arquivos disponíveis para download por outros indivíduos, tais como com anexos em um cliente de e-mail baseado na web ou um (legal) do site de compartilhamento de arquivos . Existe uma extensão do PHP que fornece acesso a ClamAV , mas é claro que você pode invocar utilidade ClamAV de linha de comando no da mesma maneira que eu demonstrei para arquivo .


<? Php
exec ( "clamscan - stdout" . $ _FILE [ "myFile" ] [ "tmp_name" ], $ out , retorno de US $ );
se ( $ return ) {
    / / Arquivo está infectado
    ...


Conclusão
Você aprendeu como é fácil para apoiar o upload de arquivos com o seu site ou aplicação web-based. Para o upload para o sucesso, o formulário HTML deve ser apresentado através de um multipart / form-data solicitação POST codificados e PHP deve permitir a transferência como especificado usando o file_uploads directiva. Depois que o arquivo é transferido, o script responsável por manipular o upload usa as informações encontradas no $ _FILES array para mover o arquivo do diretório temporário para o local desejado. Eu também experimentei algumas precauções extras que você pode tomar para proteger a si e seus usuários de alguns dos riscos associados com o upload de arquivos que permite. Você viu como você pode garantir o nome do arquivo é seguro, verifique o tipo de arquivo, impor limites rígidos sobre o tráfego de upload, e verificação de vírus.

Nenhum comentário :

Postar um comentário

Total de visualizações de página