Birisi bir filetype numara yapıyorsa nasıl söyleyebilirim?

9 Cevap php

Kullanıcıların saklanır ve daha sonra alınmak üzere, bir web sunucusu üzerinde belge ve fotoğraf depolamak için izin verir bir şey programlama ediyorum. Kullanıcıların benim sunucusuna dosya yüklediğinizde, PHP uzantısı dayalı ne dosyatürü söyler. Ancak, kullanıcılar somezipfile.png gibi bir zip dosyası yeniden adlandırmak ve depolamak, böylece benim sunucuda bir zip dosyası tutmak olabilir korkuyorum. Yüklenen bir dosyayı açın ve gerçekten söz konusu filetype ait olup olmadığını görmek için "kontrol" için herhangi bir makul bir yolu var mı?

9 Cevap

Magic number. Eğer bir ikili dosyanın ilk birkaç bayt okuyabilirsiniz Eğer o dosyanın ne tür biliyorsunuz.

Sizin için MIME sihirli aramalarını yapabilirsiniz PHP için FileInfo PECL uzantısı, kontrol edin.

Sıralama. Çoğu dosya türleri uzantısı güvenmek zorunda değilsiniz, böylece onları işaretleme için ayrılmış bazı bayt var. Site http://wotsit.org Belirli bir tip için bu bulmak için büyük bir kaynaktır.

Eğer bir unix sistemde varsa, ben dosyası komut uzantısı dayanmaz inanıyorum, böylece byte kontrol kod yazmak istemiyorsanız buna kabuk olabilir.

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

Bir PNG dosyasının ilk sekiz bayt her zaman aşağıdaki değerleri içerir:

(Ondalık) 137 80 78 71 13 10 26 10

(Onaltılık) 89 50 4e 47 0d 0a 1a 0a

(ASCII C notasyonu) 211 PNG \ r \ n \ 032 \ n \

Sadece görüntüleri ile ilgili ise, o zaman () sahte birinden geçerli bir görüntüyü ayırt edilmelidir getimagesize.

$ 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)

Getimagesize A false değer bir görüntü değildir.

Birçok filetypes onları tanımlamak için dosyanın başında, Sen dosyanın ön bazı byte okuyabilir ve bilinen sihirli numaralarının listesi için bunları karşılaştırmak "magic numbers" var.

Bir UNIX sisteminde, 'dosya' komutunun çıkışını yakalayan yeterli bilgi sağlamalıdır.

Hızlı bir şekilde PHP bunu nasıl kesin bir cevap için, bu soruyu kontrol: http://stackoverflow.com/questions/134833/how-do-i-find-the-mime-type-of-a-file-with-php#134893

Bir yan not olarak, ben kendi tür denetlemesi yapmak zorunda benzer bir sorun koştu. Benim uygulama için ön uç arayüzü flaş yapıldı. Dosyaları bir php komut dosyası için flaş geçirildi ediliyordu. Ben php kullanarak bir MIME türü denetimi yapmak için çalışıyordu zaman flaş geliyordu çünkü türü her zaman başvuru / octetstream oldu döndü.

Ben sihirli bir sayı tipi paradigma uygulamak zorunda kaldı. Ben sadece dosyanın başında içinde bulunan bazı tanımlayan desenleri ile birlikte dosya türünü düzenlenen bir xml dosyası oluşturdu. Dosya sunucusuna ulaştığında ben xml dosyası ile eşleşen bazı desen yaptım ve sonra kabul ya da dosyayı reddetti. Ben bekliyordum ya da herhangi bir gerçek performans azalma fark etmedi.

Bu orada ön uç olarak flaş kullanarak ve yüklenen kez dosyasını kontrol yazın çalışıyor olabilir herkes için sadece bir yan not.

Yanı sıra filetype belirlenmesi gibi, onlara gömülü ya da ekteki diğer dosyalar ile dosyalar için dışarı izlemek isteyebilirsiniz. Bu ne yazık ki sadece "sihirli sayı" kullanarak daha dosya içeriğini bir daha derinlemesine bir analiz gerektirir.

Örneğin, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (veri gizleme, bu özel tip kolayca yükleme ve gerçek görüntü veri .. diğerleri daha zor olacak, yeni bir dosyaya kaydetmeyi etrafında çalışmış olabilir.)