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 Mark Augusto
      Olá galera. Tenho um script de upload automático que envia o arquivo assim que selecionado. No entanto, queria saber se é possível implementar um contador para mostrar a porcentagem.
       
      Em resumo, mostrar quantos porcento está o upload. 
       
      <script type="text/javascript" > $(document).ready(function() { $('#video').live('change', function() { $("#preview_video").html(''); $("#preview_video").html('<div class="progress yellow darken-3"><div class="indeterminate yellow"></div></div>'); $("#video-up").ajaxForm({ target: '#preview_video, .preview-video', }).submit(); }); }); </script> Obrigado! 
    • Por camargo.2018
      Não faz upload de jeito nenhum esse e o código que tentei (Pfvr me ajuda :D):
       
      Html:
      <div class="conteudo">     <form enctype="multipart/form-data" action="?pag=upload-programetes" method="POST">     <input type="hidden" name="MAX_FILE_SIZE" value="999999999999999" />     Enviar novos Programetes: <input name="userfile" type="file" />     <input type="submit" value="Enviar arquivo" /> </form></div> Php:
      if($_GET['pag'] == "upload-programetes"){ $upload = upload_programetes($_FILES); echo $upload; } função:
      function upload_programetes($up){ $uploaddir = $_SERVER["DOCUMENT_ROOT"].'/programetes/'; $uploadfile = $uploaddir . basename($up['userfile']['name']); if (move_uploaded_file($up['userfile']['tmp_name'], $uploadfile)) {     return "Arquivo válido e enviado com sucesso.\n"; } else {     return "Possível ataque de upload de arquivo!\n"; } }  
    • Por sergionpinheiro
      Boa noite galera,
      Estou com a seguinte questão.
      Estou desenvolvendo um sistema que manipula arquivos em PDF.
      Eu faço o upload do arquivo para o sistema e ele fica salvo numa pasta e banco de dados.
      Meu problema é: existe a possibilidade de quando eu clicar num botão ele ir lá no banco e carregar esse arquivo no input file (tipo preenchimento automático de acordo com o cadastro do banco)?
      Pois queria que quando isso acontecesse, este campo ficaria oculto e o usuário apenas iria clicar um botão para alterar o arquivo conforme a configuração feita previamente no sistema.
      Não queria ter que clicar para carregar o arquivo no input, uma vez que, ele está salvo no sistema.
      Isso é possível?
    • Por juninhogpe
      Boa noite pessoal.
       
      Tenho um formulário para realizar o upload de fotos e uma página que recebe e faz o redimensionamento das imagens.
      Quando envio algumas imagens com extensão "jpg", me aparece como arquivo não suportado e outros são enviados corretamente.
       
      Segue abaixo meu código do formulário e o script que recebe e redimensiona as imagens:

      formulario.php
      <form name="fotos" action="img-action.php" enctype="multipart/form-data" method="post"> <div class="form-group"> <label for="exampleInputEmail1">Nome</label> <input type="text" name="nome" class="form-control" id="exampleInputEmail1" placeholder="Nome do carro"> </div> <div class="clearfix"></div> <div class="form-group"> <label for="exampleInputPassword1">Fotos</label> <input type="file" name="file[]" id="exampleInputFile" required multiple> </div> <div class="clearfix"></div> <button type="submit" class="btn btn-default">Cadastrar fotos</button> </form> img-action.php
      <?php session_start(); if (!$_SESSION["usuarioNome"]) header("Location: index.php"); include("conexao.php"); ini_set('memory_limit', '512M'); ini_set('post_max_size', '500M'); ini_set('upload_max_filesize', '500M'); function clean($string) { $a = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕºª"; $b = "aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRroa"; $string = utf8_decode($string); $string = strtr($string, utf8_decode($a), $b); //substitui letras acentuadas por "normais" $string = str_replace(" ","-",$string); // retira espaco $string = strtolower($string); // passa tudo para minusculo return utf8_encode($string); //finaliza, gerando uma saída para a funcao } function resizeImage($Largura_atual,$Altura_atual,$Tamanho_Maximo,$Pasta_Destino,$SrcImage,$Qualidade_img,$Tipo_imagem){ //Verifica se a imagem existe if($Largura_atual <= 0 || $Altura_atual <= 0) return false; //Construção proporcional da nova imagem $Imagem = min($Tamanho_Maximo/$Largura_atual, $Tamanho_Maximo/$Altura_atual); $Nova_Largura = ceil($Imagem*$Largura_atual); $Nova_Altura = ceil($Imagem*$Altura_atual); if($Largura_atual < $Nova_Largura || $Altura_atual < $Nova_Altura){ $Nova_Largura = $Largura_atual; $Nova_Altura = $Altura_atual; } $NewCanves = imagecreatetruecolor($Nova_Largura, $Nova_Altura); // Redimensionamento de imagem if(imagecopyresampled($NewCanves, $SrcImage,0, 0, 0, 0, $Nova_Largura, $Nova_Altura, $Largura_atual, $Altura_atual)){ switch(strtolower($Tipo_imagem)){ case 'image/png': imagepng($NewCanves,$Pasta_Destino); break; case 'image/gif': imagegif($NewCanves,$Pasta_Destino); break; case 'image/jpeg': case 'image/pjpeg': imagejpeg($NewCanves,$Pasta_Destino,$Qualidade_img); break; default: return false; } if(is_resource($NewCanves)) imagedestroy($NewCanves); return true; } } $nome_galeria = $_POST["nome"]; $nome_pasta = clean($nome_galeria); $destino_imagem = mkdir('fgaleria/'.$nome_pasta.'/',0777,true); // Inserção na tabela de galeria $nome_galeria = $_POST["nome"]; if(isset($_FILES['file']['name'])){ //Configurações da Imagem $Tamanho_Max_Imagem = 640; //Largura e altura máxima da imagem $Prefixo_Img_redimensionada = "imagem_comprimida"; //Prefixo para o nome da imagem salva $Pasta_Img_Original = 'original/'; $Pasta_Img_Comprimida = 'fgaleria/'; //Diretório para onde a imagem comprimida será salva $Qualidade_img = 90; $Local_Img_comprimida[] = $destino_imagem; $Local_Img_original[] = ""; if ($nome_galeria != ""){ $sql = utf8_decode("INSERT INTO fotos (nome, nome_pasta) VALUES ('$nome_galeria', '$nome_pasta')"); if($conn->query($sql) === TRUE){ echo utf8_encode("<script> alert (\"Cadastro realizado com sucesso.\");</script>"); echo utf8_encode('<script>window.location="cad_foto.php";</script>'); } else{ echo "Erro: " . $sql . "<br />" .$conn->error; echo utf8_encode('<script>window.location="cad_foto.php";</script>'); } } $cont = $_FILES['file']['tmp_name']; for($i = 0; $i < count($cont); $i++){ // Algumas informações das imagens que serão necessárias. $Nome_Imagem = $_FILES['file']["name"][$i]; $Tamanho_Imagem = $_FILES['file']['size'][$i]; $TempSrc = $_FILES['file']['tmp_name'][$i]; $Tipo_imagem = $_FILES['file']['type'][$i]; $Process_Imagem = true; //Validação de arquivo e criação da imagem a partir da imagem que foi feito upload. switch(strtolower($Tipo_imagem)){ case 'image/png': $Imagem_Criada = imagecreatefrompng($TempSrc); break; case 'image/gif': $Imagem_Criada = imagecreatefromgif($TempSrc); break; case 'image/jpeg': case 'image/pjpeg': $Imagem_Criada = imagecreatefromjpeg($TempSrc); break; default: $Process_Imagem = false; //Formato do arquivo não suportado! } //Pega o tamanho da imagem list($Largura_atual,$Altura_atual) = getimagesize($TempSrc); //Local para as imagens de destino $DestRandNome_Imagem = 'fgaleria/'.$nome_pasta.'/'.$Nome_Imagem; //Name for Big Image date_default_timezone_set('America/Sao_Paulo'); $data_upload = date('Y-m-d H:i:s'); //Redimensionamento da imagem para o tamanho especificado na função resizeImage. if($Process_Imagem && resizeImage($Largura_atual,$Altura_atual,$Tamanho_Max_Imagem,$DestRandNome_Imagem,$Imagem_Criada,$Qualidade_img,$Tipo_imagem)){ //Novo tamanho para imagem list($ResizedWidth,$ResizedHeight)=getimagesize($DestRandNome_Imagem); $Local_Img_comprimida = $DestRandNome_Imagem; } else{ echo '<p style="color:red;">Ocorreu um erro ao processar.<strong>'.$Nome_Imagem.'</strong></div>'; //output error } } } echo '<script language="javascript">alert("Imagens enviadas com sucesso!")</script>'; ?>  
      O que vocês acham que pode ser?
       
      Obrigado desde já.
    • Por Rafael Freitas
      Boa tarde galera,
      Eu tenho o seguinte código para fazer upload de imagem para uma determinada pasta no servidor.
      $nome_temporario=$_FILES["arquivo"]["tmp_name"]; $nome_real=$_FILES["arquivo"]["name"]; copy($nome_temporario,"arq_mf_eletronico/$nome_real"); Ele está funcionando normalmente, faz o upload e guarda o caminho da imagem no banco de dados ou seja arq_mf_eletronico/nome da imagem, porém eu precisava que ele também mudasse o nome da imagem, para que não se repita o nome do arquivo na pasta do servidor.

      A pergunta  é: como eu faria isso?
       
      Ainda não tenho muito conhecimento.
      Conto com a ajuda de vocês.
       
      Abraço.
×

Informação importante

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