Ir para conteúdo

POWERED BY:

Arquivado

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

P3rukao

Validar Mime-Types para uploads

Recommended Posts

Olá "povu foreiro",

 

Eu já vi esse assunto de validar o mime-type dos arquivos circular muito por aí... mas eu continuo com duvidas quanto a isso!!!

 

Eu já entendi a parte de que pra verificar o mime, basta checar se o "TYPE" do arquivo, corresponde com aquele que você quer limitar para o seu form de upload, para isso basta verificar numa tabela, os mime types existentes!!!

 

Porém, como segurança eh fundamental quando o assunto eh "transporte de dados", eu tentei fazer umas brincadeiras aqui com os arquivos a serem enviados... e vi... que não basta apenas verificar o mime desses arquivos...

 

Eu alterei a extensão de um arquivo .txt por exemplo, para o de um .mp3 e enviei-o pelo meu form. Para minha surpresa, o arquivo passou, e isso aconteceu com todos os outros arquivos que testei em seguida. Somente aqueles que tinham a extensão diferente da que foi permitida foram barrados (os arquivos com .txt de verdade).

 

Daí eu pergunto:

» Como fazer para validar totalmente um arquivo, antes de fazer o upload do mesmo???

» Estou tentando com um arquivo de audio (audio/mpeg). Como faço para validá-lo, para evidar os "dedos-nervosos" dos outros aí??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atenção hein?!

Validar mime-type é diferente de validar a extensão.

Como você fez?

http://br2.php.net/manual/en/ref.fileinfo.php

http://br2.php.net/mime-content-type

Compartilhar este post


Link para o post
Compartilhar em outros sites

E usei disso Willian, eu não estou validando extensão naum...

Estou pegando o TYPE do arquivo que enviei pelo form, e fazendo a verificação com o que eu quero...

 

$arquivo = $_FILES['arquivo'];
$mime = "audio/mpeg";


if($arquivo['type'] != $mime ) {echo "extensão errada... e etc e talz...";}

Essa parte está funcionando beleza... se eu tentar enviar um arquivo .txt, ele barra, não deixa passar....

Porém, se eu pegar esse mesmo .txt e alterar a sua extensão para .mp3, ele deixa passar...

 

Eu vi ontem mesmo aqui no fórum, um tópico que falava disso... e lah dizia que não serve apenas verificar o mime, por que se eu alterar a extensão propositalmente, essa verificação falha...

Daí eu teria que usar, por exemplo, uma função específica daquele tipo de arquivo.

Nesse post o cara mostrou que se eu usasse um getimagesize(), para detectar o tamanho da imagem, se o cara tivesse mandado um .txt alterado, ele não passaria como no caso anterior, pois a função iria retornar um erro por conta do arquivo estar em formato errado!!!

 

» Mas no meu caso... eu preciso mesmo eh validar um arquivo de audio... (mp3)...

 

Mas abri esse tópico afim de tentar definir para o máximo possivel dos tipos de arquivos.... como fazer a sua validação completa, pra naum deixar nenhum "dedo-nervoso" furar a segurança do nosso form!!!

 

O máximo de opiniões que puderem dar, melhor, assim agente consegue encerrar esse assunto de uma vez!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas de que exatamente vale validar a extensão do arquivo????

 

"Só pra mim naum passar batido nessa"... validar a extensão que você diz, eh pegar o nome do arquivo e verificar os caracteres no final da string do mesmo???? Ou validar a extensão, que você diz eh de outro jeito???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Extensão são os caracteres depois do último ponto no final do nome arquivo... Exemplos: txt, mp3, wav, php, htm, html, rar e etc.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... foi meio que isso que eu disse antes... soh que do jeito que você falou, deu a intender que havia outro significado para extensão... Ô.õ

 

MAs de qqr forma... de que que vale verificar os caracteres finais do arquivo... soh o mime bastaria pra isso...

 

Por exemplo... se eu envio um arquivo .txt e o meu form soh aceita .mp3, ele vai barrar tanto validando por extensão, como por mime... e se eu trocar a extensão do arquivo manualmente (do .txt para o .mp3), ele vai passar normalmente... EM AMBOS!!!!

 

 

A questão eh fazer a segunda validação.... O QUÊ VALIDAR???? COMO VALIDAR???

 

» entenderam onde quero chegar???

Compartilhar este post


Link para o post
Compartilhar em outros sites

não precisa validar a extensão

 

a nomenclatura do arquivo não incluencia em nada

 

 

se renomear o aruqivo cujo content-type seja plain/text, de .txt para .mp3, o arquivo continuará sendo um arquivo de texto.

pode renomear pra .exe, .qualquercoisa, que continuará sendo um arquivo de texto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato... e ... agora nós voltamos ao início do assunto do tópico!!!

 

» Como fazer a validação completa do arquivo???? «

 

Por que, somente checar o mime num tá funcionando, e nem eh seguro, deixar somente nessa validação!! õ.Ô

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... Eu recomendo que você faça o seguinte:

 

Primeiro, valide o mime type do arquivo para ter certeza que ele não foi renomeado/alterado pelo visitante.

 

SE você for manter o nome original do arquivo enviado, valide a extensão do arquivo enviado.

 

Caso a extensão do arquivo enviado não tenha passado no teste, mas o mime type sim, renomeie o arquivo quando for salvá-lo no servidor. Mantendo assim o arquivo com a extensão certa e o tipo (mime type) correto.

 

Se a extensão passar e o mime type for inválido, peça para o visitante reenviar o arquivo.

 

--

 

O que realmente diz se o que o visitante está enviando é um arquivo de música, é o mime type... Mas se você for manter o nome do arquivo enviado, você tambem precisa validar a extensão (.mp3) do arquivo.

 

Exemplo: O mime type é o seu DNA, ele diz se você é homem ou mulher. Mas você pode ser homem e usar um nome de mulher. Se eu não for te chamar por um apelido, eu preciso que você tenha um nome de homem também pra condizer com o seu DNA e não dar confusão pra ninguém. =)

 

É isso

 

http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehehe... gostei do exemplo ~, mas no meu caso, eu estou mudando o nome do arquivo, colocando um apelido no caso... xD

 

Pra ficar mais claro de como estou fazendo... óh o codigo:

 

<?
include ("../_incs/server_admin.php");
include ("../../_incs/funcoes.php");
$arquivo = isset($_FILES["midia"]) ? $_FILES["midia"] : FALSE;// Prepara a variável caso o formulário tenha sido postado

$config = array();
$config["tamanho"] = 	10485760; // Tamano máximo da midia, em bytes = 10MB

$redirectPage = $serverAdmin."sistema_radio/cadRadio.php";

$config["diretorio"] = "midia/";// Diretório onde a midia será salva
//$mime = array('audio/mp3','audio/mpeg','audio/mpeg3','audio/mpg');
$mime = "audio/mpeg";

// Gera um nome para a midia e verifica se já não existe, caso exista, gera outro nome e assim sucessivamente..
// Função Recursiva
function nome($extensao)
{
	global $config;

	// Gera um nome único para a midia
	$temp = substr(md5(uniqid(time())), 0, 10);
	$midia_nome = $novo_nome . $temp . "." . $extensao;
	
	// Verifica se o arquivo já existe, caso positivo, chama essa função novamente
	if(file_exists($config["diretorio"] . $midia_nome))
	{
		$midia_nome = nome($extensao);
	}
	return $midia_nome;
}

if($arquivo)
{	
	$erro = true;
	// Verifica o mime-type do arquivo para ver se é de midia.
	// Caso fosse verificar a extensão do nome de arquivo, o código deveria ser:
	//if(!eregi("^audio\/(mp3|mpeg|mpeg3|mpg)$", $arquivo["type"]))
	if($arquivo["type"] != $mime)
	{
		//$erro[] = "Arquivo em formato inválido! A midia deve ser em formato mp3. Envie outro arquivo";
		$erro = false;
		Redirecionar_URL($redirectPage."?erro=1");
	}
	else
	{
		// Verifica tamanho do arquivo
		if($arquivo["size"] > $config["tamanho"])
		{
			//$erro[] = "Arquivo em tamanho muito grande! A midia deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
			$erro = false;
			Redirecionar_URL($redirectPage."?erro=2");
		}
	}
	
	if($erro == true)
	{
		// Pega extensão do arquivo, o indice 1 do array conterá a extensão
		preg_match("/\.(mp3|mpeg|mpeg3|mpg){1}$/i", $arquivo["name"], $ext);
		
		// Gera nome único para a midia
		$midia_nome = nome($ext[1]);

		// Caminho de onde a midia ficará
		$midia_dir = $config["diretorio"] . $midia_nome;
		
		// Faz o upload da midia
		move_uploaded_file($arquivo["tmp_name"], $midia_dir);
		
		include("recebeCadRadio.php");
	}
	elseif ($erro == false)
	{
		Redirecionar_URL($redirectPage."?erro=0");
	}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Reparei essa linha na função nome() você usa:

 

$midia_nome = $novo_nome . $temp . "." . $extensao;

 

Essa variavel $novo_nome, ela não existe ou ela vem de fora da função? Se vem de fora você precisa usar o global como usou pra $config...

 

Dá uma olhada nisso.

 

@Edit

Se você está procurando sobre os mimetypes de cada extensão, dá uma olhada:

http://www.webmaster-toolkit.com/mime-types.shtml

http://web.duke.edu/websrv/file-extensions.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

viiigi... eu esqueci de tira-la daí... eh que estava tentando por um nome personalizado antes do nome randomizado que ela gera... mas nem tava pegando... num sei porque ¬¬

 

 

Eu dei uma olhada no links... parece que está mais completa do que a que eu mostrei no inicio do topico....

 

Mas o que eu queria, naum eh saber sobre os tipos de mime-types exatamente, ..., pelo menos de início, eu queria saber fazer essa segunda validação... pra deixar o meu script mais supimpa.... pq, o prazo já tá acabando pra mim entregar isso, e.. tow vendo que vou ter que entregar com essas brechas e alterar depois....

 

Por isso, quanto antes eu souber, menos dor de cabeça eu vou ter.... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um exemplo de validação da extensão e do mime type... Claro que você precisa adaptar isso ao seu script:

 

<?php

	// Adicione aqui as extensões permitidas (digite todos em caixa baixa)
	$extensoes_ok = array('mp3', 'wma');

	// Adicione aqui os mime types perimitios (digite todos em caixa baixa)
	$mimetypes_ok = array('audio/mpeg3', 'audio/x-mpeg-3');

	// Defina duas variaveis com informações do upload
	$arquivo = 'meuarquivo.mp3';
	$mimetype = 'audio/mpeg3';

	$extensao = strtolower(end(explode('.', $arquivo)));
	$mimetype = strtolower($mimetype);

	if ((array_search($extensao, $extensoes_ok) !== FALSE) AND (array_search($mimetype, $mimetypes_ok) !== FALSE)) {
		echo "ok";
	} else {
		echo "erro";
	}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

~, eu testei o teu script aqui... num form simples mesmo, com um inputFile enviando o arquivo mesmo... e uma outra página recebendo...

alterei o $arquivo, e pus as mensagens de erro ou sucesso... mas ele sóh tá entrando no else... num inporta o tipo do arquivo...

 

Tentei uma reca aqui e nem o mp3 nem o doc,txt,pdf, ..., nenhum da o OK!!!

 

» õ.Ô «

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim... eu testei do jeito que tava... e depois coloquei $mimetype = 'audio/mpeg';.... nenhum dos dois pegou!!!! =/

 

você testou esse script aí??? Tá funcionando???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém tá com os erros do PHP desativados.. :P

 

A ordem dos argumentos no array_search() tava trocada.

 

Pega o código atualizado, testado, e funcionando ali em cima.

 

Abraços http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.