Pergunta

Eu estou trabalhando em um script que irá processar o usuário envia para o servidor, e como uma camada adicional de segurança que eu gostaria de saber:

Existe uma maneira de detectar um arquivo verdadeira extensão/tipo de arquivo, e garantir que ele não é um outro tipo de arquivo mascarado com uma extensão diferente?

Há um byte ou carimbo de um identificador único para cada tipo/extensão?

Eu gostaria de ser capaz de detectar que alguém não tenha aplicado uma extensão diferente para o ficheiro que está a carregar.

Obrigado,

Foi útil?

Solução

Não, realmente não.

Você precisará ler os primeiros bytes de cada arquivo e interpretá -lo como um cabeçalho para um conjunto finito de arquivos conhecidos. A maioria dos arquivos possui cabeçalhos de arquivos distintos, algum tipo de metadados nos primeiros bytes ou primeiros kilobytes no caso do MP3.

Seu programa terá que simplesmente tentar analisar o arquivo para cada um dos seus filetipos aceitos.

Para o meu programa, envio a imagem carregada para o ImageMagick em um bloco de tentativa e, se ele explodir, acho que foi uma imagem ruim. Isso deve ser considerado inseguro, porque estou carregando dados binários arbitrários (fornecidos pelo usuário) em um programa externo, que geralmente é um vetor de ataque. Aqui, confio que o ImageMagick não faça nada com o meu sistema.

Eu recomendo escrever seus próprios manipuladores para os arquivos significativos que você pretende usar, para evitar vetores de ataque.

EDIT: Vejo no PHP que existem algumas ferramentas para fazer isso por você.

Além disso, os tipos de MIME são o que o navegador do usuário alega que o arquivo é. É útil e útil lê -los e agir sobre eles em seu código, mas não é um método seguro, porque qualquer pessoa que lhe envie arquivos ruins fingirá os cabeçalhos MIME facilmente. É uma espécie de defesa da linha de frente manter seu código que espera que um JPEG faça um png, mas se alguém incorporou um vírus em um .exe e o nomeou JPEG, não há razão para não ter falsificado o tipo MIME.

Outras dicas

O PHP tem algumas maneiras de ler o conteúdo do arquivo para determinar seu tipo MIME, dependendo da versão do PHP que você está usando:

Dê uma olhada no Funções FileInfo Se você está executando o Php 5.3+

$finfo = finfo_open(FILEINFO_MIME); 
$type = finfo_file($finfo, $filepath);
finfo_close($finfo);  

Como alternativa, verifique MIME_CONTENT_TYPE Para versões mais antigas.

$type = mime_content_type($filepath);

Observe que apenas validar o tipo de arquivo não é suficiente se você deseja estar realmente seguro. Alguém poderia, por exemplo, fazer upload de um arquivo JPEG válido que explora uma vulnerabilidade em um renderizador comum. Para se proteger, você precisaria de um scanner de vírus bem conservado.

PHP tem um superglobal $ _Files que contém informações como tamanho e tipo de arquivo. Parece que o tipo é tomado de algum tipo de cabeçalho, não uma extensão, mas posso estar errado.

Há um exemplo disso Site W3Schools.

Vou testar se for pode ser enganado quando tiver uma chance.

ATUALIZAR:

Todo mundo provavelmente sabia disso, mas os $ _Files podem ser enganados. Consegui determinar da seguinte maneira:

$arg = escapeshellarg( $_FILES["file"]["tmp_name"] );
system( "file $arg", $type );
echo "Real type:  " . $type;

Basicamente usa o Unix's Arquivo comando. Provavelmente existem maneiras melhores, mas não uso o PHP há algum tempo. Normalmente evito usar comandos do sistema, se possível.

Isso ainda pode ser forjado. Eu garantiria que você não possa (ou não) executar um arquivo enviado para o servidor automaticamente.

Eu também teria um scanner de vírus/espião, e deixe fazer o trabalho para você.

Você pode usar o código abaixo, o que fornece o tipo MIME se você mudou a extensão, então também

$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo $mime = finfo_file($finfo, $_FILES['userfile']['tmp_name']);
finfo_close($finfo);

Usuários do Windows: basta editar php.ini e descomentar esta linha:

extension=php_fileinfo.dll

Lembre -se de reiniciar o Apache para o novo Php.ini entrar em vigor.

Em *nix, os dois primeiros bytes do arquivo informam (consulte "Número mágico"). No Windows, ... às vezes isso será verdade ("Informações do cabeçalho"). Em última análise, é dependente do sistema operacional.

Executáveis em geral, têm uma "assinatura" no primeiro bytes;Acho difícil que para realmente saber qual o tipo de arquivo é realmente.

Quais tipos de arquivo você espera? Talvez você possa verificar se isso está em conformidade com o que você espera e rejeitar todo o resto.

Outros já mencionaram o FileInfo, o que eu acho que é a solução correta, mas vou adicionar isso apenas caso você não possa usá -lo por algum motivo. A maioria (tudo?) *Distros nix incluem um comando chamado file que quando executado em um arquivo produzirá seu tipo. Ele tem uma mudança para saída em formato legível por humanos (padrão) ou tipo MIME. Você pode ter seu script invocar este programa no arquivo carregado e ler o resultado. Novamente, essa não é a abordagem preferida. Se você estiver no Windows, este utilitário está disponível no Cygwin.

Verificar o tipo MIME é simplesmente o suficiente? Estou assumindo que alterar a extensão em um arquivo não altera seu tipo MIME?

O MIME tipo A é um indicador suficientemente forte para participar aqui?

Obrigado por todas as respostas até agora.

Verificar o tipo MIME é simplesmente o suficiente? Estou assumindo que alterar a extensão em um arquivo não altera seu tipo MIME? O MIME tipo A é um indicador suficientemente forte para participar aqui?

Realmente depende de como é usado.

  • Se você fornecer uploads e downloads, nada importa, pois ele não é executado.
  • Se for tratado pelo servidor da Web, dependerá de como o servidor da Web está configurado, embora sujeito à maioria dos restos desses comentários.
  • Se for uma imagem, ele será exibido, ou não, ou será o alvo das explorações da biblioteca de imagens. Mas apenas aqueles.
  • Algo como um arquivo PDF pode não afetar seu servidor, mas o computador da pessoa acessando o arquivo.
  • Se for passado para uma função como "System ()", voltaremos ao comportamento do sistema operacional-como se fosse "clicado duas vezes", e a extensão do arquivo poderá até ser considerada.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top