Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

twpesquisa

Upload de arquivos ...

Recommended Posts

Amigos, encontrei o código abaixo, e gostaria de saber como posso fazer a seguinte alteração:

Como sabemos, existem "usuário" mal intensionados, e ao tentar realizar o upload de um determinado arquivo diferente do permitido, o mesmo realiza a alteração da extensão do arquivo.

Pergunto, como posso fazer no código abaixo, mesmo que o usuário altere a extensão, o sistema não permita o envio do arquivo, isso é possível ?

 

<?php
// DEFINIÇÕES
// Numero de campos de upload
$numeroCampos = 5;
// Tamanho máximo do arquivo (em bytes)
$tamanhoMaximo = 1000000;
// Extensões aceitas
$extensoes = array(".doc", ".txt", ".pdf", ".docx");
// Caminho para onde o arquivo será enviado
$caminho = "uploads/";
// Substituir arquivo já existente (true = sim; false = nao)
$substituir = false;
 
for ($i = 0; $i < $numeroCampos; $i++) {
 
	// Informações do arquivo enviado
	$nomeArquivo = $_FILES["arquivo"]["name"][$i];
	$tamanhoArquivo = $_FILES["arquivo"]["size"][$i];
	$nomeTemporario = $_FILES["arquivo"]["tmp_name"][$i];
 
	// Verifica se o arquivo foi colocado no campo
	if (!empty($nomeArquivo)) {
 
		$erro = false;
 
		// Verifica se o tamanho do arquivo é maior que o permitido
		if ($tamanhoArquivo > $tamanhoMaximo) {
			$erro = "O arquivo " . $nomeArquivo . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
		} 
		// Verifica se a extensão está entre as aceitas
		elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
			$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
		} 
		// Verifica se o arquivo existe e se é para substituir
		elseif (file_exists($caminho . $nomeArquivo) and !$substituir) {
			$erro = "O arquivo <b>" . $nomeArquivo . "</b> já existe";
		}
 
		// Se não houver erro
		if (!$erro) {
			// Move o arquivo para o caminho definido
			move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));
			// Mensagem de sucesso
			echo "O arquivo <b>".$nomeArquivo."</b> foi enviado com sucesso. <br />";
		} 
		// Se houver erro
		else {
			// Mensagem de erro
			echo $erro . "<br />";
		}
	}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria algo assim ?:

 

//Para imagens, faço assim:
if(!eregi("^image\/(jpg|jpeg|png|gif|bmp)$", $arquivo_imagem["type"]))
  {
  }

//Para documentos do tipo WORD, EXCEL e PDF, faço assim ???
if(!eregi("^application\/(doc|docx|xls|xlsx|pdf)$", $arquivo_imagem["type"]))
  {
  }

Para documentos com extensão do word, excel e pdf, faço como coloquei acima ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso mesmo, assim além de verificar a extensão do arquivo o script verifica também o tipo MIME, aumentando consequentemente a segurança.

 

Em vez de usar expressão regular você pode usar array, assim fica no mesmo padrão das extensões no script que você pegou e fica mais fácil de incluir ou excluir novos tipos de arquivos futuramente.

 

$mimes_permitidos = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'application/doc', 'application/docx');

$mime_arquivo = $_FILES['arquivo']['type'][$i];

if (in_array($mime_arquivo, $mimes_permitidos))
{
	// Tipo válido
}
else
{
	// Tipo inválido
}

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tchê, mas estou com um problema:

Veja abaixo:

 

$numeroCampos = 1;
$tamanhoMaximo = 1000000;
$extensoes = array("application/doc", "application/docx", "application/xls", "application/xlsx", "application/pdf");
$caminho = "adm/corretor/doc/";
$substituir = false;
 
for ($i = 0; $i < $numeroCampos; $i++) {
	$nomeArquivo = $_FILES["arquivo"]["name"][$i];
	$arquivoPermitido = $_FILES["arquivo"]["type"][$i];
	$tamanhoArquivo = $_FILES["arquivo"]["size"][$i];
	$nomeTemporario = $_FILES["arquivo"]["tmp_name"][$i];
 
	if (!empty($nomeArquivo)) {
 
		$erro = false;

		if ($tamanhoArquivo > $tamanhoMaximo) {
			$erro = "O arquivo " . $nomeArquivo . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
		} 

		elseif (!in_array($arquivoPermitido, $extensoes)) {
			$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
		} 

		elseif (file_exists($caminho . $nomeArquivo) and !$substituir) {
			$erro = "O arquivo <b>" . $nomeArquivo . "</b> já existe";
		}

		if (!$erro) {
            $titulo = $_POST["txtMaterial"];
            $desc = $_POST["txtDescricao"];
            $path = $caminho . $nomeArquivo;
			
            $sql = "INSERT INTO msmatapo () values ('','$titulo','$desc','$path')";  
            $res = mysql_query($sql) or die("1º msg: Error in query<br>: $sql. <br>" .mysql_error());
            if ($res){

			   move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));

			   echo "O arquivo <b>".$nomeArquivo."</b> foi enviado com sucesso. <br />";


                echo "<script>alert('Link cadastrado com sucesso!')</script>
                      window.opener.document.location.reload();
                      window.close();";
	         }
	        else{
		      echo"Ocorreu um erro ao tentar cadastrar o link.";
		      echo"<br><br>";
		      echo"<div align='center'><a href='javascript:window.history.go(-1)'>VOLTAR</a> </div>";
		      die("2º msg: ERRO:<br> $sql. <br>" .mysql_error());
	         }		    
		} 
		else {

			echo $erro . "<br />";
		}
	}
}

Fiz como você havia comentado, porém quando vou tentar fazer o upload ocorre a mensagem:

 

A extensão do arquivo Administrativo.doc não é válida

 

Sendo que o arquivo é DOC mesmo....

 

Consegues visualizar o erro ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sou novo em PHP, mas creio que isso resolva

 

elseif (array_search($arquivoPermitido, $extensoes) === FALSE)

abrx

Compartilhar este post


Link para o post
Compartilhar em outros sites

malliotti,

 

Os arquivos DOC possuem vários mimes diferentes, você deve colocar todos. O código que eu postei é só um exemplo.

 

Você pode ver todos os mimes existentes neste endereço:

 

http://filext.com/file-extension/DOC

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sabe, da forma como está abaixo, o sistema funciona...

Mas seria muito mais interessante que checagem do tipo de arquivo fosse realizada pelo mime e não apenas pela extensão.

Será que não existe outra alternativa ?

 

include "conexao.php";

// DEFINIÇÕES
// Numero de campos de upload
$numeroCampos = 1;
// Tamanho máximo do arquivo (em bytes)
$tamanhoMaximo = 10000000;
// Extensões aceitas
$extensoes = array(".doc", ".pdf", ".docx");
// Caminho para onde o arquivo será enviado
$caminho = "corretor/doc/";
// Substituir arquivo já existente (true = sim; false = nao)
$substituir = false;

for ($i = 0; $i < $numeroCampos; $i++) {
 
// Informações do arquivo enviado
$nomeArquivo      = $_FILES["arquivo"]["name"][$i];
$arquivoPermitido = $_FILES["arquivo"]["type"][$i];
$tamanhoArquivo   = $_FILES["arquivo"]["size"][$i];
$nomeTemporario   = $_FILES["arquivo"]["tmp_name"][$i];

// Verifica se o arquivo foi colocado no campo
if (!empty($nomeArquivo))
   {
 	$erro = false;
	// Verifica se o tamanho do arquivo é maior que o permitido
	if ($tamanhoArquivo > $tamanhoMaximo)
	   {
		$erro = "O arquivo " . $nomeArquivo . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
	   } 
    // Verifica se a extensão está entre as aceitas
    elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
			$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
		} 
	// Verifica se o arquivo existe e se é para substituir
	elseif (file_exists($caminho . $nomeArquivo) and !$substituir)
	   {
		$erro = "O arquivo <b>" . $nomeArquivo . "</b> já existe";
	   }
 	// Se não houver erro
	if (!$erro)
	   {
		// Move o arquivo para o caminho definido
		move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));
		echo "O arquivo <b>".$nomeArquivo."</b> foi enviado com sucesso. <br />";		
			   
        $titulo = $_POST["txtMaterial"];
        $desc = $_POST["txtDescricao"];
        $path = $caminho . $nomeArquivo;
        $sql = "INSERT INTO msmatapo () values ('','$titulo','$desc','$path')";  
        $res = mysql_query($sql) or die("1º msg: Error in query<br>: $sql. <br>" .mysql_error());
        if ($res)
		   {
            echo "<script>alert('Material cadastrado com sucesso!')</script> window.opener.document.location.reload(); window.close();";
	       }
	    else
		   {
		    echo"Ocorreu um erro ao tentar cadastrar o material.";
		    echo"<br><br>";
		    echo"<div align='center'><a href='javascript:window.history.go(-1)'>VOLTAR</a> </div>";
		    die("2º msg: ERRO:<br> $sql. <br>" .mysql_error());
	       }		    
		} 
		// Se houver erro
	else
	   {
		// Mensagem de erro
		echo $erro . "<br />";
	   }
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim amigo, foi o que você sugeriu...

Porém, quando coloco a sua instrução, o sistema não permite o upload..

 

Segue apenas alguns trechos:

// Extensões aceitas
$extensoes = array("application/doc", "application/docx", "application/xls", "application/xlsx", "application/pdf");

// Informações do arquivo enviado
$nomeArquivo      = $_FILES["arquivo"]["name"][$i];
$arquivoPermitido = $_FILES["arquivo"]["type"][$i];
$tamanhoArquivo   = $_FILES["arquivo"]["size"][$i];
$nomeTemporario   = $_FILES["arquivo"]["tmp_name"][$i];

E este é a parte da verificação...

    // Verifica se a extensão está entre as aceitas
    elseif (!in_array($arquivoPermitido, $extensoes)) {
			$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
		} 

Sei que já estou encomodando com este assunto, mas sinceramente não estou sabendo como solucionar este problema.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que vi você colocou o array com os tipos mimes na mesma variável que antes você estava usando pra colocar as extensões, neste caso você tirou a validação de extensão?

 

Se você manter a linha abaixo não vai funcionar, pois na variável $extensoes que antes haviam as extensões permitidas agora você colocou os mimes.

 

elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
	$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
} 

Outra coisa, você não incluiu todos os mimes de cada tipo de arquivo, eu te passei um link onde você pode encontrar todos os mimes.

 

Qualquer coisa de um echo na variável $arquivoPermitido pra ver qual tipo está sendo usado no envio do seu arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, estou retomando este assunto...

Sinceramente eu gostaria que fosse realizado a validação não pela extensão do arquivo mas sim pelo mime...

Vo disponibinilizar novamente o meu código:

 

<?
require "adminsessao.php"; 
include "../funcoes/conexao.php";

$numeroCampos = 1;
$tamanhoMaximo = 10000000;
$extensoes = array(".doc", ".pdf", ".docx", ".xls");
$caminho = "corretor/doc/";
// Substituir arquivo já existente (true = sim; false = nao)
$substituir = false;

for ($i = 0; $i < $numeroCampos; $i++) {
$nomeArquivo      = $_FILES["arquivo"]["name"][$i];
$arquivoPermitido = $_FILES["arquivo"]["type"][$i];
$tamanhoArquivo   = $_FILES["arquivo"]["size"][$i];
$nomeTemporario   = $_FILES["arquivo"]["tmp_name"][$i];

if (!empty($nomeArquivo)){
	$erro = false;
if ($tamanhoArquivo > $tamanhoMaximo){
	$erro = "O arquivo " . $nomeArquivo . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
} 
   elseif (!in_array(strrchr($nomeArquivo, "."), $extensoes)) {
		$erro = "A extensão do arquivo <b>" . $nomeArquivo . "</b> não é válida";
} 
elseif (file_exists($caminho . $nomeArquivo) and !$substituir){
	$erro = "O arquivo <b>" . $nomeArquivo . "</b> já existe";
}
if (!$erro){
	move_uploaded_file($nomeTemporario, ($caminho . $nomeArquivo));
	echo "O arquivo <b>".$nomeArquivo."</b> foi enviado com sucesso. <br />";		
       $titulo = $_POST["txtMaterial"];
       $desc = $_POST["txtDescricao"];
       $path = $caminho . $nomeArquivo;
       $sql = "INSERT INTO msmatapo () values ('','$titulo','$desc','$path')";  
       $res = mysql_query($sql) or die("1º msg: Error in query<br>: $sql. <br>" .mysql_error());
       if ($res){
           echo "<script>alert('Documento enviado com sucesso!')</script><script>window.opener.document.location.reload(); self.close();</script>";
    }
    else{
	  echo"Ocorreu um erro ao tentar cadastrar o link.";
	  echo"<br><br>";
	  echo"<div align='center'><a href='javascript:window.history.go(-1)'>VOLTAR</a> </div>";
	  die("2º msg: ERRO:<br> $sql. <br>" .mysql_error());
    }		    
 } 
else{
  echo $erro . "<br />";
}
}
}
?>

 

Este é o código que estou usando atualmente e está funcionando, porém, se o usuário alterar a extensão do arquivo para as permitidas, o sistema funciona.

Os colegas já colocaram algumas alternativas, mas sinceramente não consegui entender.

Quem puder me ajudar eu agradeço.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Abra o link que o Leozitho passou: http://filext.com/file-extension/DOC

 

Perceba esse trecho:

Mime type: application/msword [official]

application/doc, appl/text, application/vnd.msword, application/vnd.ms-word, application/winword, application/word, application/x-msw6, application/x-msword

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK, mas esse trecho eu vou substituir onde ?

Ele vai permanecer um array ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leia todo o tópico denovo.

 

Em vez de usar expressão regular você pode usar array, assim fica no mesmo padrão das extensões no script que você pegou e fica mais fácil de incluir ou excluir novos tipos de arquivos futuramente.

$mimes_permitidos = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'application/doc', 'application/docx');

Os arquivos DOC possuem vários mimes diferentes, você deve colocar todos. O código que eu postei é só um exemplo.

Outra coisa, você não incluiu todos os mimes de cada tipo de arquivo, eu te passei um link onde você pode encontrar todos os mimes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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