Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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";
}
?>>
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?
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.
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.
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 ;)
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?
>
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?
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
Cara, por padrao, voce deve apenas instalar a extensao no php, o que consiste basicamente em:
O processo em si é bem simples, mas atente que você precisa:
Infomações aqui: File Info
>
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?
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.
>
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
?
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);