Pergunta

Estou programação algo que permite aos usuários armazenar documentos e imagens em um servidor web, a ser armazenados e recuperados mais tarde. Quando os usuários fazer upload de arquivos para o meu servidor, PHP me diz o filetype é baseada na extensão. No entanto, estou com medo de que os usuários podem renomear um arquivo zip como somezipfile.png e armazená-lo, mantendo assim um arquivo zip no meu servidor. Existe alguma maneira razoável para abrir um arquivo carregado e "verificação" para ver se ele realmente é da referida filetype?

Foi útil?

Solução

Magia número . Se você pode ler primeiros bytes de um arquivo binário que você pode saber que tipo de arquivo é.

Outras dicas

Confira o FileInfo extensão PECL para PHP, que pode fazer o MIME pesquisas mágica para você.

Mais ou menos. A maioria dos tipos de arquivos têm alguns bytes reservados para marcá-los para que você não tem que contar com a extensão. O site http://wotsit.org é um excelente recurso para encontrar este para fora para um tipo particular.

Se você estiver em um sistema UNIX, acredito que o comando arquivo não contar com a extensão, assim que você poderia desembolsar a ele se você não quer escrever o código de verificação byte.

Para PNG ( http://www.w3.org/TR/PNG- Rationale.html )

Os primeiros oito bytes de um arquivo PNG sempre conter os seguintes valores:

(decimal) 137 80 78 71 13 10 26 10

(hexadecimal) 89 50 47 4e 0d 0a 1a 0a

(ASCII C notação) \ 211 P N L \ r \ n \ 032 \ N

Se você está lidando apenas com imagens, em seguida, getimagesize () deve distinguir uma imagem válida a partir de um falso.

$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
  [0]=>
  int(200)
  [1]=>
  int(200)
  [2]=>
  int(2)
  [3]=>
  string(24) "width="200" height="200""
  ["bits"]=>
  int(8)
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(10) "image/jpeg"
}

$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)

Um valor falso de getimagesize não é uma imagem.

Muitos tipos de arquivos têm " números mágicos " no início do arquivo para identificá-los, você pode ler alguns bytes a partir da frente do arquivo e compará-los com uma lista de números mágicos conhecidos.

Em um sistema UNIX, capturando a saída do comando 'file' deve fornecer informações adequadas.

Para uma resposta exata sobre como você pode rapidamente fazer isso em PHP, confira esta pergunta: Como faço para encontrar o tipo MIME de um arquivo com php?

Como uma nota lateral eu tive um problema semelhante onde eu tinha que fazer minha própria verificação de tipo. A interface de front-end para o meu pedido foi feito em flash. Os arquivos estavam sendo passado através de flash para um script php. Quando eu estava tentando fazer uma verificação de tipo MIME usando php do tipo sempre retornado foi application / octetstream porque ele estava vindo de flash.

Eu tive que implementar um paradigma mágica números tipo. Eu simplesmente criou um arquivo xml que segurava o tipo de arquivo, juntamente com alguns padrões que definem encontrados dentro do início do arquivo. Depois que o arquivo alcançou o servidor eu fiz alguma correspondência de padrão com o arquivo xml e, em seguida, aceito ou rejeitado o arquivo. Eu não notei qualquer diminuição de desempenho real quer que eu estava esperando.

Esta é apenas uma nota de lado a qualquer um que pode ser usar o flash como há front-end e tentando digitar verificar o arquivo uma vez que é carregado.

Além de identificar o tipo de arquivo, você pode querer atente para arquivos com outros arquivos incorporados ou anexados a eles. Esta, infelizmente, exigem uma análise mais aprofundada do conteúdo do arquivo do que apenas usando "números mágicos".

Por exemplo, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (este tipo particular de ocultamento de dados podem ser facilmente contornado carga e resaving em um novo arquivo dos dados de imagem reais .. os outros vão ser mais difícil.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top