Ir para conteúdo
onedev

Filtrar Upload de arquivos apenas para imagens

Recommended Posts

Olá Pessoal,

qual a forma mais segura de filtrar um upload asp de arquivos para somente imagens?

Tentei reconhecer a extensão do arquivo e limitar apenas upload de arquivo .gif/.jpg e também filtrar pelo tipo de arquivo. Porém algum mal intencionado pode simplesmente renomear um arquivo malicioso para .gif, fazer o upload e depois acessar o arquivo para executa-lo. Alguém conhece ou recomenda algum filtro eficiente?

Utilize os seguintes recursos:
For Each File in Upload.Files 
   If File.ContentType <> "image/gif" Then 
      Resposta = "Arquivo enviado nao e um formato valido de imagem." 
      File.Delete 
   End If 
Next

 

For Each File in Upload.Files 
   If UCase(Right(File.Path, 3)) <> "gif" Then 
      Resposta = "Arquivo enviado nao e um formato valido de imagem." 
      File.Delete 
   End If 
Next
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Após muita pesquisa cheguei a conclusão de que não é possível limitar o upload de arquivos pelo tipo. Pois ao alterar a extensão do arquivo de .php para .gif por exemplo o filtro não irá barrar. 

Como solução para evitar vulnerabilidades, o ideal é se certificar de dar apenas permissão de leitura e escrita na pasta que receberá os arquivos do upload e nunca liberar permissão de execução. Pois assim mesmo que um arquivo malicioso seja enviado, ele não poderar ser executado. Instruções aqui: https://wiki.locaweb.com.br/pt-br/Permissão_de_arquivos_–_Como_se_proteger_da_execução_de_scripts_indesejados

 

Além disso a instalação de uma ferramenta como o Eset File Security no servidor, é essencial para varrer arquivos maliciosos.
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Netanias dos Santos
      Boa noite, estou em um projeto de Área de Membros que eu mesmo desenvolvi em ASP... É muito boa e está integrada com Hotmart.
      Agora, preciso mudar para PHP.
       
      Quem pode me ajudar nesta empreitada?
      Como pagamento, eu darei uma cópia desta Área de Membros como pagamento.
       
      O primeiro código é esse!
       
      CÓDIGO ASP...
      <%
      If Session("ADM_Email") <> "" Then

          Response.Cookies("LogosADM").item("EmailAdmin") = Session("ADM_Email")
          Response.Cookies("LogosADM").item("SenhaAdmin") = Session("ADM_Senha")
          Response.Cookies("LogosADM").Expires = DateAdd("d",7,Now)
      ' Se não for o primeiro acesso, recupera do cookie para a session
       
      ElseIf Session("ADM_Email") = "" Then
       
          Session("ADM_Email") = Request.Cookies("LogosADM").item("EmailAdmin")
          Session("ADM_Senha") = Request.Cookies("LogosADM").item("SenhaAdmin")
      'Se for o primeiro acesso, cria a Session e também salva no cookie, para recuperar no próximo acesso.
       
      End If
      %>
       
      <%
      If Session("ADM_Email") = "" OR Session("ADM_Senha") = "" Then
       
          Response.Redirect("https://www.meusite1.com.br/gerenciador/login.asp")
       
      End If
      %>
       
      Como mudar para PHP?
       
      (Se você tiver interesse, acredito que em 1 semana, terei como migrar totalmente o sistema, pois desenvolvo em ASP.... Então, já tenho alguma noção de lógica... Só preciso do suporte, pois não tenho tempo suficiente para aprender a linguagem, e depois fazer a migração!)
       
      Farei todos os pedidos neste único tópico...
    • Por PeeWee
      Estou tentando implementar no meu sistema um upload de arquivo, para que o usuário ao criar seu login possa subir sua foto, achei um código interessante na web porém está exibindo o erro,
      Strict standards: Only variables should be passed by reference in C:
      consultei alguns fóruns sem exito. Segue o código: 
       
      $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
      if (array_search($extensao, $_UP['extensoes']) === false) {
      echo "Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif";
      }
       
      // Faz a verificação do tamanho do arquivo
      else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
      echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
      }
       
      Durante minha pesquisa li que não é permitido passar o retorno de um array para outra função, o método que se deve fazer é atribuir este retorno a uma variável e usar esta variável como referência, pois bem, tentei a seguinte alteração
       
      $extensao = strtolower(explode('.', $_FILES['arquivo']['name']));
      $extensaoDois = end( $extensao);
      if (array_search($extensao, $_UP['extensoes']) === false) {
      echo "Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif";
      }
       
      // Faz a verificação do tamanho do arquivo
      else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
      echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
      }
      Porém sem exito. Aguardo sugestões dos colegar.
    • Por MichellHenrique
      Ola pessoal,
       
      estou com problema em uploads em clientes android, mesmo dando permissão para o navegador acessar o armazenamento
      do celular tem arquivos que eu consigo subir e outros que não consigo. O sistema de upload é bem simples, esta funcionando
      bem no windows e no linux. Suspeito que o problema esteja diretamente relacionado as permissões no android mas ainda nao
      achei uma solução. Alguém ja passou por isso?
       
      Obs: Testei nos navegadores chrome, firefox e operamini no android e todos apresentam o mesmo problema...
       
      index.html
      ... <form method="POST" action="upload.php" enctype="multipart/form-data"> <input type="file" name="file1" id="file1"> <input type="submit" value="Enviar"> </form> ...  
      upload.php
      <?php // Carrega arquivo de configurações require('config.php'); // Recebe arquivo a ser enviado de forma ternária $arquivo1 = (isset($_FILES['file1'])) ? $_FILES['file1'] : null; // Essa parte é por desencargo de consiencia caso por // ventura o arquivo estivesse trasendo permissões // anteriores do android que impedissem sua movimentação if(chmod($arquivo1['tmp_name'], 0777)){ echo 'Permissão mudada'; }else{ echo 'Permissão negada'; } // Aqui um teste simples para saber se o arquivo foi // transferido para a pasta temporaria do servidor if(file_exists($arquivo1['tmp_name'])){ echo 'O arquivo existe'; }else{ echo 'O arquivo não existe'; } // Move o arquivo baixado para a pasta informada no // arquivo config.php e mostra mensagem sobre a transferência echo move_uploaded_file($arquivo1['tmp_name'], $pastaupload.$arquivo1['name']) ? 'Envio Completo!' : 'Falha No Envio!'; ?>  
    • Por Eddy Fernandes
      Olá galera,
       
      Estou desenvolvendo uma página com um form disparado para um link externo, mas antes preciso salvar os dados em um banco de dados. Não manjo muito de Javascript, então sou grato pela ajuda de quem puder ajudar. O código está assim:
       
      Página do form:
      <form action="URL-pra-onde-vao-os-dados-do-form" method="post" onSubmit="javascript:return Valida(this)"> Na mesma página do Form:
      <script language="JavaScript"> function Valida(form) { var formulario = document.getElementById('id-do-form-aqui'); <% set BD=server.createobject("adodb.connection") BD.open MM_global_STRING Dim rsATV : Set rsATV = Server.CreateObject("adodb.recordset") rsATV.Open "usuarios",BD,3,3 'Tentativa de correção de acentuação no BD bem sucedida. 'Response.CharSet = "windows-1250" 'Session.LCID = 1046'PADRÃO BRASILEIRO rsATV.AddNew rsATV("us_nome_real") = Request.Form("FNAME") rsATV("us_email") = Request.Form("EMAIL") rsATV("us_nome") = Request.Form("USUARIO") rsATV("us_senha") = Request.Form("SENHA") rsATV("us_confirme_senha") = Request.Form("CONFIRMESENHA") rsATV.Update rsATV.Close %> formulario.submit(); return false }; end function </script>  
      Os Form é enviado, o novo registro no banco é criado, mas sem os dados do form, ou seja, um registro em branco.
       
      Desde já agradeço a ajuda.
       
       
    • Por Gabriel Zaia
      Pessoinhas, estou tendo um probleminha com logica, estou tentando fazer um upload multiplo de imagens com nomes variados de imagens e queria salvá-as depois os nomes das imagens no banco de dados com as seguintes informações: 
      id, Nome da imagem, id da casa
      Porém está ocorrendo um erro ao realizar upload 
      Parse error: syntax error, unexpected ',' in adm\gravar.php on line 16
      Se puderem me ajudar.
      Obs: Sou meio novato na área, então tenham paciência suahsuha.
      <?php session_start(); include('config/config.php'); $idcasa = $_SESSION["idcasa"]; $banner = 1; $diretorio = "fotos/"; if(!is_dir($diretorio)) { echo "Pasta $diretorio nao existe"; }else{ $arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE; for ($controle = 0; $controle < count($arquivo['name']); $controle++){ $aleatorio = rand(5, 10); $valor = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz0123456789"), 0, $aleatorio); $novonome = $valor.'.jpg'; $destino = $diretorio."/".$arquivo['name'][$controle]. $nomefinal; if(move_uploaded_file([$controle], $destino)){ echo "Upload realizado com sucesso <br>"; $sql = mysqli_query("insert into fotos (id, nome, idcasa) values ('', '$novonome', '$idcasa')") }else{ echo "Erro ao realizar upload! <br>"; } } } ?>  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.