Como fazer o upload seguro de imagens em ASP

Guia para Upload Seguro de Imagens em ASP através do componente ASPUpload

05/04/2024

Como fazer o upload seguro de imagens em ASP

Como fazer o upload seguro de imagens em ASP

Introdução

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.

Código Pronto para Uso

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
%>

Explicando o Código

A seguir, detalhamos o funcionamento do script de upload, descrevendo cada componente crucial para o processo seguro de envio de imagens.

Formulário HTML para Upload

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>

Criação do Objeto de Upload

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

Definição de Extensões de Arquivo Permitidas

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")

Verificação de Extensão e Nome do Arquivo

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

Salvamento do Arquivo

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>"

Liberação do Objeto de Upload

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

Observações Importantes

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.

Conclusão

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.

Este artigo nas redes sociais: Facebook, Twitter/X, LinkedIn, Telegram, Pinterest, Tumblr, Flipboard, Mastodon

Domínios hospedados
Clientes satisfeitos