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 .cfm com 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
0 responses to “Upload arquivos de imagens com segurança”