«

»

Jan 09

Print this Post

Upload arquivos de imagens com segurança

Problema:

Permitir usuários fazerem upload de arquivos de imagens, que serão então exibidas, pode parecer extremamente simples mas tem seus desafios e preocupações de segurança. O principal perigo é o fato de que muita da informação disponível para nós na hora do pedido de upload é fornecida pelo navegador do cliente (client/Browser), o que significa que toda aquela informação tm o potencial de ser falsificada por um hacker inescrupuloso.

Solução:

Podemos seguramente fazer o upload de arquivos de imagens enviando-os a um diretório temporário (sem acesso pelo web) e então movendo-os abaixo da raiz do web uma vez que estivermos certos que é um arquivo de imagem válido e seguro.

Explicação detalhada:

Por exemplo, tenha em mente que o atributo accept da tag cffile pode apenas validar o tipo MIME contra aquele que é fornecido pelo client/browser. Uma vez mais, isso pode ser falsificado e então não pode ser confiado! O exemplo a seguir ainda está propenso a aceitar um arquivo .cfmcom o tipo MIME de image/gif falsificado:


<cffile action="upload" filefield="uploadFile"
destination="#expandPath('images')#" accept="image/gif" />

A seguinte receita é relativamente simples e demonstra um número de medidas de segurança tomadas quando do upload do arquivo:

  • Use o atributo acceptna tag cffilepara limitar os tipos MIME aceitos do cliente; capture possíveis erros emitidos.
  • Salve arquivos carregados  em um diretório temporário que não seja acessável pelo client/browser.
  • Aproveite a função isImageFile() para assegurar que o arquivo carregado seja uma imagem.
  • Limite as extensões de arquivos permitidas.
  • Limite o tamanho de arquivo permitido.

<cfset imagesDir = "images" />
<cfset imagesPath = expandPath(imagesDir) />
<cfset uploadPath = getTempDirectory() />
<cfset acceptMimeTypes = "image/gif,image/jpeg,image/png" />
<cfset acceptExtensions = "gif,jpeg,jpg,png" />
<!--- Process file upload, if form submitted --->
<cfif structKeyExists(form, "uploadFile")>
     <!--- Catch error if MIME type is not accepted --->
     <cftry>
          <cffile action="upload" filefield="uploadFile" destination="#uploadPath#"
          accept="#acceptMimeTypes#" nameConflict="makeUnique" result="uploadResult" />
          <cfcatch type="any">
               <p>ERROR: <cfoutput>#cfcatch.message#<br/>#cfcatch.detail#</cfoutput></p>
          </cfcatch>
     </cftry>
     <!--- Proceed only if successful upload... --->
     <cfif isDefined("uploadResult")>
          <!--- Ensure that file is an image --->
          <cfif isImageFile("#uploadPath#/#uploadResult.serverFile#")
          AND listFindNoCase(acceptExtensions, uploadResult.serverFileExt)
          AND uploadResult.fileSize LTE 102400 >
               <!--- OK to move the file from the temporary
               location to the images folder under Web root --->
               <cffile action="move" source="#uploadPath#/#uploadResult.serverFile#"
               destination="#imagesPath#" />
               <!--- Display success message, stats and image --->
               <cfoutput>
               <p>Image uploaded! (#uploadResult.serverFile#, 
               #numberFormat(uploadResult.fileSize/1024 )# KB)</p>
               <p><img src="#imagesDir#/#uploadResult.serverFile#" /></p>
               </cfoutput>
          <cfelse>
               <!--- File upload not allowed! --->
               <!--- Show error message and delete file from temp directory --->
               <p>ERROR: You may only upload a 100 KB or less
               file of type image with one of the following file extensions:
               #replace( acceptExtensions, ",", ", ", "all" )#.</p>
               <cffile action="delete" file="#uploadPath#/#uploadResult.serverFile#" />
         </cfif>
     </cfif>
</cfif>
<!--- Display form to allow user to select an image file to upload --->
<cfoutput>
<form action="#cgi.script_name#" method="post" enctype="multipart/form-data">
     Select image to upload: <input type="file" name="uploadFile" />
     <input type="submit" value="Upload File" />
</form>
</cfoutput>

Downloado código exemplo aqui.

by Jamie Krug
Versão original em inglês: Adobe ColdFusion Cookbook


Permanent link to this article: http://ensina.me/coldfusion/upload-arquivos-de-imagens-com-seguranca/

Leave a Reply