Ir para conteúdo

POWERED BY:

Arquivado

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

_SDinfo

PHP validar arquivo

Recommended Posts

Galera, o código abaixo funciona bem. Mas além de saber se o arquivo é aceito ou não, gostaria de saber se "ele é o que diz ser", ou seja, o usuário poderia muito bem jogar um exe no servidor falando que é um txt ("falsificar" a extensão). Como fazer está validação?

 

<?php
$arquivo = "./bsd.jpg";
   $mime_types = array(
       'txt' => 'text/plain',
       'htm' => 'text/html',
       'html' => 'text/html',
       'php' => 'text/html',
       'css' => 'text/css',
       'js' => 'application/javascript',
       'json' => 'application/json',
       'xml' => 'application/xml',
       'swf' => 'application/x-shockwave-flash',
       'flv' => 'video/x-flv',

       // images
       'png' => 'image/png',
       'jpe' => 'image/jpeg',
       'jpeg' => 'image/jpeg',
       'jpg' => 'image/jpeg',
       'gif' => 'image/gif',
       'bmp' => 'image/bmp',
       'ico' => 'image/vnd.microsoft.icon',
       'tiff' => 'image/tiff',
       'tif' => 'image/tiff',
       'svg' => 'image/svg+xml',
       'svgz' => 'image/svg+xml',

       // archives
       'zip' => 'application/zip',
       'rar' => 'application/x-rar-compressed',
       'exe' => 'application/x-msdownload',
       'msi' => 'application/x-msdownload',
       'cab' => 'application/vnd.ms-cab-compressed',

       // audio/video
       'mp3' => 'audio/mpeg',
       'qt' => 'video/quicktime',
       'mov' => 'video/quicktime',

       // adobe
       'pdf' => 'application/pdf',
       'psd' => 'image/vnd.adobe.photoshop',
       'ai' => 'application/postscript',
       'eps' => 'application/postscript',
       'ps' => 'application/postscript',

       // ms office
       'doc' => 'application/msword',
       'rtf' => 'application/rtf',
       'xls' => 'application/vnd.ms-excel',
       'ppt' => 'application/vnd.ms-powerpoint',

       // open office
       'odt' => 'application/vnd.oasis.opendocument.text',
       'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
   );

$ext = pathinfo($arquivo,PATHINFO_EXTENSION);
if(array_key_exists($ext, $mime_types)){
	echo "Extensão aceita<br />";
	echo $ext;
} else {
	echo "Extensão não aceita";
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

através das funções fileinfo

 

Exemplo retirado, e adaptado, do manual do PHP:

//cria o resource para obter mime type
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);

//imprime o mime type
echo finfo_file($fileInfo, $nomeArquivo) . "\n";

//fecha o resouce
finfo_close($fileInfo);

Compartilhar este post


Link para o post
Compartilhar em outros sites

através das funções fileinfo

 

Exemplo retirado, e adaptado, do manual do PHP:

//cria o resource para obter mime type
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);

//imprime o mime type
echo finfo_file($fileInfo, $nomeArquivo) . "\n";

//fecha o resouce
finfo_close($fileInfo);

 

Existe outra forma que não seja com finfo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!

 

Olha uma funcao com duas opções para identificar o mime:

 

<?php
Function Arquivo_Mime($Arquivo_URL = '') {

If (function_exists('mime_content_type'))
  { $RT           = mime_content_type($Arquivo_URL);
  } Else
If (function_exists('finfo_file'))
  { $Info         = finfo_open(FILEINFO_MIME_TYPE);
    $RT           = finfo_file($Info, $Arquivo_URL);
  } Else { $RT    = ''; }

Return $RT;
}
?>

No caso de não ter a classe finfo.

 

Agora, só comparar o mime da extensao com o retorno da funcao.

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No manual do PHP:

mime_content_type — Detect MIME Content-type for a file (deprecated)

 

Não deve-se mais utilizar essa função. Sobra-se apenas fileinfo. Por isso nem falei sobre ela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, uso versoes antigas do php ainda, por isso sugeri pois podia funfar pra ti.

Rapaz, agora pra detectar o mime sem finfo so usando uma classe, tem uma aqui no iMasters, deixa ver se acho...

 

Aqui o: Class Mime Magic

 

É do João Batista Neto ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionar vai (por um certo tempo ainda). Mas é o mesmo que montar a estrutura de um site com tabelas. Também funciona, mas não deve ser feito. Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionar vai (por um certo tempo ainda). Mas é o mesmo que montar a estrutura de um site com tabelas. Também funciona, mas não deve ser feito. Entendeu?

 

Valeu galera. Então vamos partir para "finfo" mesmo. Alguém ai poderia me ajudar a utilizar este recurso no ambiente Linux? É preciso fazer a instalação deste?

Compartilhar este post


Link para o post
Compartilhar em outros sites
This extension is enabled by default as of PHP 5.3.0. Before this time, fileinfo was a PECL extension but is no longer maintained there. However, versions prior to 5.3+ may use the » discontinued PECL extension.

 

Se o seu php for > 5.3.0, já é padrão. Se não, entre neste link

 

 

Agora vi que há a possibilidade de utilizar a SPL para isso: SplFileInfo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, por padrao, voce deve apenas instalar a extensao no php, o que consiste basicamente em:

- baixar a extensao

- envia-la para a pasta de extensoes do php

- alterar o php.ini para adicionar o carregamento da extensao

 

O processo em si é bem simples, mas atente que você precisa:

- uma versão do php que suporte File Info;

- acesso as configurações do PHP no servidor, este se não tiver, terp´ade pedir ao suporte do seu host

 

Infomações aqui: File Info

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o seu php for > 5.3.0, já é padrão. Se não, entre neste link

 

 

Agora vi que há a possibilidade de utilizar a SPL para isso: SplFileInfo

 

Estava vendo aqui. PHP 5.3.3 se não me engano. Mas quando a utilizo a tela fica em branco.

Acredito que tenho que ativar a extensão. Onde faria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tirar conclusões precipitadas, devemos saber qual é o erro. "Supor" é muito abrangente.

 

Utilize esse código na primeira linha do seu script:

ini_set( 'display_errors', true );
error_reporting( E_ALL );

 

Execute novamente, e veja qual erro que aparece.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tirar conclusões precipitadas, devemos saber qual é o erro. "Supor" é muito abrangente.

 

Utilize esse código na primeira linha do seu script:

ini_set( 'display_errors', true );
error_reporting( E_ALL );

 

Execute novamente, e veja qual erro que aparece.

 

Cara muito obrigado. Coloquei o código que você falou e pude observar que era questão de permissão.

 

Continuando:

<?php
$arquivo = "./bsd.png";

   $mime_types = array(
       'txt' => 'text/plain',
       'htm' => 'text/html',
       'html' => 'text/html',
       'php' => 'text/html',
       'css' => 'text/css',
       'js' => 'application/javascript',
       'json' => 'application/json',
       'xml' => 'application/xml',
       'swf' => 'application/x-shockwave-flash',
       'flv' => 'video/x-flv',

       // images
       'png' => 'image/png',
       'jpe' => 'image/jpeg',
       'jpeg' => 'image/jpeg',
       'jpg' => 'image/jpeg',
       'gif' => 'image/gif',
       'bmp' => 'image/bmp',
       'ico' => 'image/vnd.microsoft.icon',
       'tiff' => 'image/tiff',
       'tif' => 'image/tiff',
       'svg' => 'image/svg+xml',
       'svgz' => 'image/svg+xml',

       // archives
	'tar' => 'application/x-gtar',
	'7z' => 'application/x-7z-compressed',
	'bzip' => 'application/x-bzip',
	'bzip2' => 'application/x-bzip2',
	'rar' => 'application/x-rar-compressed',
       'zip' => 'application/zip',
       'rar' => 'application/x-rar-compressed',
       'exe' => 'application/x-msdownload',
       'msi' => 'application/x-msdownload',
       'cab' => 'application/vnd.ms-cab-compressed',

       // audio/video
       'mp3' => 'audio/mpeg',
       'qt' => 'video/quicktime',
       'mov' => 'video/quicktime',
	'mpeg4' => 'application/mp4',
	'avi' => 'video/x-msvideo',

       // adobe
       'pdf' => 'application/pdf',
       'psd' => 'image/vnd.adobe.photoshop',
       'ai' => 'application/postscript',
       'eps' => 'application/postscript',
       'ps' => 'application/postscript',

       // ms office
	'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
       'doc' => 'application/msword',
       'rtf' => 'application/rtf',
       'xls' => 'application/vnd.ms-excel',
       'ppt' => 'application/vnd.ms-powerpoint',

       // open office
       'odt' => 'application/vnd.oasis.opendocument.text',
       'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
   );

$fileInfo = finfo_open(FILEINFO_MIME_TYPE);
echo $teste = finfo_file($fileInfo, $arquivo) . "\n";
finfo_close($fileInfo);

?>

 

Como fazer neste caso para retornar a extensão associada ao mime type? Por exemplo exibir para o usuário a mensagem:

 

Seu arquivo é do tipo: png

?

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.