05/04/2024
Carregar imagens em um site é uma tarefa comum, mas requer cuidados para garantir a segurança. Este artigo demonstra como realizar o upload de imagens de forma segura usando ASP, com foco em evitar uploads mal-intencionados e proteger tanto o servidor quanto os usuários.
Abordaremos desde a validação básica do arquivo até medidas de segurança avançadas, oferecendo um guia passo a passo. A intenção é facilitar para desenvolvedores a implementação de um processo de upload que seja tanto eficiente quanto seguro.
A seguir, o código HTML para o formulário de upload. Salve este código em um arquivo HTML para permitir que os usuários enviem imagens para o seu site. Ele direciona para o script de processamento de upload chamado upload.asp
.
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="upload.asp">
<input type="file" size="40" name="imageFile"><br>
<input type="submit" value="Upload Image">
</form>
</body>
</html>
E agora, o script ASP que processa o upload. Salve este código em um arquivo chamado upload.asp
. Este script realiza as verificações de segurança e salva o arquivo de imagem no servidor se passar por todas as validações.
<%
Dim objUpload, allowedExtensions, fileExtension, fileName
Set objUpload = Server.CreateObject("Persits.Upload")
' Configura o objeto de upload
objUpload.OverwriteFiles = False
' Lista de extensões de arquivo permitidas
allowedExtensions = Array("jpg", "jpeg", "png", "gif", "bmp", "webp", "avif")
' Itera por cada arquivo enviado
For Each objFile In objUpload.Files
fileName = objFile.FileName
fileExtension = LCase(Mid(fileName, InStrRev(fileName, ".") + 1))
' Verifica se a extensão do arquivo está na lista de permitidos
If Not (UBound(Filter(allowedExtensions, fileExtension)) >= 0) Then
Response.Write "Erro: Apenas arquivos de imagem nos formatos (jpg, jpeg, png, gif, bmp, webp, avif) são permitidos.<br>"
ElseIf InStr(fileName, "..") > 0 Or InStr(fileName, ":") > 0 Or InStr(fileName, "/") > 0 Or InStr(fileName, "\") > 0 Then
' Verifica a presença de sequências ou caracteres que possam indicar tentativa de Directory Traversal
Response.Write "Erro: O nome do arquivo contém caracteres inválidos.<br>"
Else
' Se o arquivo passar por todas as verificações, procede com o salvamento
' Gera um nome de arquivo seguro
Dim safeFileName
safeFileName = Now.Ticks & "_" & Replace(objFile.FileName, " ", "_")
' Salva o arquivo no diretório de upload
objFile.SaveAs Server.MapPath("/upload/" & safeFileName)
Response.Write "Upload da imagem efetuado com sucesso. Nome seguro do arquivo: " & safeFileName & "<br>"
End If
Next
Set objUpload = Nothing
%>
A seguir, detalhamos o funcionamento do script de upload, descrevendo cada componente crucial para o processo seguro de envio de imagens.
O formulário HTML permite que os usuários selecionem e enviem arquivos de imagem para o servidor. Utiliza o método POST e o tipo de conteúdo multipart/form-data
, necessários para o upload de arquivos. Aponta para upload.asp
, onde o processamento do arquivo será realizado.
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="upload.asp">
<input type="file" size="40" name="imageFile"><br>
<input type="submit" value="Upload Image">
</form>
</body>
</html>
Neste trecho, criamos o objeto de upload usando a biblioteca Persits. Esse objeto é essencial para o processo de upload, permitindo a manipulação dos arquivos enviados. A propriedade OverwriteFiles
é definida como False
para evitar a sobrescrita de arquivos já existentes.
Dim objUpload, allowedExtensions, fileExtension, fileName
Set objUpload = Server.CreateObject("Persits.Upload.1")
' Configura o objeto de upload
objUpload.OverwriteFiles = False
Este trecho do código define quais extensões de arquivo são permitidas para upload, restringindo o tipo de conteúdo que pode ser enviado para o servidor, como uma medida de segurança para evitar uploads indesejados ou maliciosos.
' Lista de extensões de arquivo permitidas
allowedExtensions = Array("jpg", "jpeg", "png", "gif", "bmp", "webp", "avif")
Antes de salvar o arquivo enviado no servidor, este trecho do código verifica se a extensão do arquivo está na lista de extensões permitidas e se o nome do arquivo não contém caracteres que possam indicar uma tentativa de acessar diretórios não autorizados (Directory Traversal).
' Itera por cada arquivo enviado
For Each objFile In objUpload.Files
fileName = objFile.FileName
fileExtension = LCase(Mid(fileName, InStrRev(fileName, ".") + 1))
' Verifica se a extensão do arquivo está na lista de permitidos
If Not (UBound(Filter(allowedExtensions, fileExtension)) >= 0) Then
Response.Write "Erro: Apenas arquivos de imagem nos formatos (jpg, jpeg, png, gif, bmp, webp, avif) são permitidos.<br>"
ElseIf InStr(fileName, "..") > 0 Or InStr(fileName, ":") > 0 Or InStr(fileName, "/") > 0 Or InStr(fileName, "\") > 0 Then
' Verifica a presença de sequências ou caracteres que possam indicar tentativa de Directory Traversal
Response.Write "Erro: O nome do arquivo contém caracteres inválidos.<br>"
Else
' Se o arquivo passar por todas as verificações, procede com o salvamento
End If
Next
Após confirmar que o arquivo enviado é uma imagem válida e seu nome não apresenta riscos, este trecho do código gera um nome de arquivo seguro, utilizando o timestamp atual para unicidade, e salva o arquivo no diretório de upload designado no servidor.
' Gera um nome de arquivo seguro
Dim safeFileName
safeFileName = Now.Ticks & "_" & Replace(objFile.FileName, " ", "_")
' Salva o arquivo no diretório de upload
objFile.SaveAs Server.MapPath("/upload/" & safeFileName)
Response.Write "Upload da imagem efetuado com sucesso. Nome seguro do arquivo: " & safeFileName & "<br>"
Após o processamento do upload e salvamento dos arquivos, é importante liberar os recursos utilizados pelo objeto de upload. Este trecho do código encerra o uso do objeto objUpload
, liberando a memória alocada para ele.
Set objUpload = Nothing
Requisito do Componente: O código acima requer que o servidor tenha o componente ASPUpload, da Persits. A MCO2 possui este componente instalado em todos os servidores Windows. Você pode transferir sua hospedagem para nossa empresa e ganhar até 60 dias de hospedagem gratuita.
Implementação Segura: Recomendamos que este código seja implementado dentro de uma área administrativa, de forma que apenas administradores logados com senha possam utilizar o script.
Proteção de Diretórios: Se seu site está hospedado na MCO2, fique tranquilo, pois você pode proteger diretórios com senha em seu site diretamente através do painel da hospedagem.
Implementar um upload de imagens seguro em ASP é essencial para a proteção do seu site e dos dados dos usuários.
Para uma referência completa das propriedades, métodos e funções do ASPUpload, consulte a documentação oficial.