Pergunta

Estou desenvolvendo um aplicativo Web ASP.NET e gostaria que o usuário pudesse fazer upload de uma imagem de seu sistema local ou passar uma URL para uma imagem.A imagem pode ser JPG ou PNG.Com quais questões de segurança devo me preocupar ao fazer isso?Já vi várias maneiras de incorporar código em arquivos JPG.Existe algum método em C # (ou bibliotecas externas) que possa confirmar se um arquivo é JPG/PNG, caso contrário, gerará um erro?No mínimo, estou tornando o diretório que contém as imagens enviadas não navegável e colocando um limite máximo de tamanho de 1 MB, mas gostaria de implementar verificações adicionais.

Obrigado por qualquer conselho.

Foi útil?

Solução

Existe algum método em C # (ou bibliotecas externas) que possa confirmar se um arquivo é JPG/PNG, caso contrário, gerará um erro?

Talvez, mas isso realmente não ajuda por si só.Você pode facilmente criar um arquivo que seja um formato de imagem válido e contém conteúdo HTML/script ativo para detecção de conteúdo do IE.Ou então há que se preocupar com as políticas de origem Java e Flash quebradas, que podem ter o mesmo efeito de scripts no contexto de segurança do seu servidor.

  1. Se você processar a imagem (por exemplo.cortar, redimensionar) e salvar novamente, o que torna muito, muito difícil realizar ataques de contrabando de conteúdo.No entanto, você deve sempre garantir que suas ferramentas do lado do servidor estejam atualizadas, pois vulnerabilidades nas bibliotecas de processamento de imagens podem expô-lo a explorações no lado do servidor.

  2. Se você não puder fazer isso, sua melhor aposta como mitigação para todos os problemas de injeção de conteúdo é veicular suas imagens de um [sub]domínio diferente que não tenha acesso a nenhuma das credenciais confidenciais (cookies, autenticação básica) do site principal.

  3. Se estiver usando um subdomínio para essa finalidade, como images.example.com, seu site principal deve estar acessível apenas através www.example.com e não example.com.Caso contrário, o conteúdo injetado em images.example.com pode acessar cookies para example.com no IE. example.com deveria redirecionar 301 para www.example.com para evitar vazamento indesejado de cookies em geral.

  4. Adicione o cabeçalho X-Content-Type-Options: nosniff à resposta para bloquear ataques de contrabando de conteúdo do IE8.(Infelizmente, não ajuda com versões anteriores.)

Também:

  1. Limpar nomes de arquivos especificados pelo usuário é duro, especialmente se seu aplicativo provavelmente estiver sendo executado em um servidor Windows onde as regras sobre nomes de arquivos utilizáveis ​​são realmente complicadas.Um bom lugar para começar é permitir apenas caracteres alfanuméricos e adicionar sua própria extensão e prefixo de arquivo.(Um prefixo é necessário para evitar os nomes de arquivos reservados do Windows e o nome de arquivo vazio.)

  2. Melhorar:armazene o nome de arquivo fornecido pelo usuário no banco de dados em vez de usá-lo como um nome de arquivo real.

Ver essa questão para mais discussões sobre problemas de segurança no upload de arquivos.

Outras dicas

Este é um campo minado absoluto.Algo a ter em consideração (não necessariamente uma lista exaustiva, sem garantias, etc.).

  • Algumas pessoas usam regexs para análise, portanto não há como saber se o arquivo contém código.Os arquivos ZIP têm seu diretório no final.Sun/Oracle Java PlugIn/WebStart agora verifica se o arquivo começa com um número mágico de cabeçalho/entrada local ZIP para evitar ataques "GIFAR".
  • Servir a partir de um domínio diferente, para evitar problemas de mesma origem.
  • Servir a partir de um endereço IP diferente, para evitar problemas de mesma origem.
  • É um pouco complicado verificar se o arquivo está explorando, digamos, um buffer overflow de 0 dia.Pode até explorar um loop infinito para criar um DoS.
  • É melhor recodificar a imagem.
  • Cuidado com o URL/nome do caminho do arquivo.Se você tiver uma opção, use a verificação da lista de permissões.Em particular, os caracteres NUL são "divertidos".Consulte também ataques de passagem de diretório.Em geral, ser capaz de colocar um arquivo com determinado conteúdo em um local conhecido é, no mínimo, uma grande fraude.
  • Ou imagens que você pode querer verificar se o tamanho é adequado.A descompactação de uma imagem enorme pode levar a um DoS.Observe também que os algoritmos de compactação geralmente permitem a compactação de dados triviais por enorme fatores.

Não deixe que o usuário determine o nome do arquivo que será usado no seu servidor.Use [generated guid].jpg e coloque o nome do arquivo usado em uma tabela de banco de dados, se necessário.

Veja o nº 12 aqui: http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

Controle externo de nome ou caminho do arquivo Quando você usa a entrada de um estranho ao construir um nome de arquivo, o caminho resultante pode apontar para fora do diretório pretendido.Um invasor pode combinar múltiplos ".." ou sequências semelhantes para fazer com que o sistema operacional navegue para fora do diretório restrito.Outros ataques relacionados a arquivos são simplificados pelo controle externo de um nome de arquivo, como o link simbólico, o que faz com que seu aplicativo leia ou modifique os arquivos que o invasor não pode acessar diretamente.O mesmo se aplica se o seu programa estiver sendo executado com privilégios elevados e aceita nomes de arquivos como entrada.Regras semelhantes se aplicam aos URLs e permitindo que um estranho especifique URLs arbitrários.

Tenha cuidado com o URL também, certifique-se de que seja um URL externo absoluto para que eles não possam usar seu próprio servidor web para copiar um arquivo confidencial de sua LAN para uma área onde possam acessá-lo, já que você carregará esse URL de código em execução no seu servidor web.

Você pode usar Infraestrutura como um serviço para tratamento de imagens, por exemplo nossa solução - Uploadcare:

https://uploadcare.com

Se você aplicar qualquer um dos operações de imagem à imagem carregada, ela será modificada e, portanto, qualquer código que possa estar incorporado no arquivo será destruído.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top