Nasıl programlama bir dosyanın gerçek uzatma / türünü belirleyebilirsiniz?

10 Cevap php

Ben sunucuya kullanıcı yüklenenler işleyecek bir senaryo üzerinde çalışıyorum, ve ek bir güvenlik katmanı olarak ben bilmek istiyorum:

Bir dosyanın gerçek uzantısı / dosya türünü algılayamıyor, ve farklı bir uzantıya sahip maskeli başka bir dosya türü değildir sağlamak için bir yolu var mı?

Bir bayt damga veya her tip / uzantısı için bazı benzersiz tanımlayıcı var mı?

Ben birileri karşıya dosyanın üzerine farklı bir uzantısı uygulanan olmadığını tespit edebilmek istiyorum.

Teşekkür ederim,

10 Cevap

Pek değil, hayır.

Her dosyanın ilk birkaç bayt okuma ve bilinen dosya türlerini sonlu bir kümesi için bir başlık olarak yorumlamak gerekir. Çoğu dosyaları farklı dosya başlıkları, MP3 durumunda ilk birkaç byte veya ilk birkaç kilobayt içinde meta çeşit var.

Programınız sadece kabul filetypes her biri için dosya ayrıştırma denemek zorunda olacak.

Benim program için, bir try-catch bloğu içinde imagemagic'den için yüklenen görüntü göndermek ve patlarsa, o zaman kötü bir görüntü oldu sanırım. Ben genellikle bir saldırı vektörü harici bir program, rasgele (kullanıcı tarafından sağlanır) ikili veri yükleme ediyorum, çünkü bu, güvensiz kabul edilmelidir. Burada, benim sistem için bir şey yapmak değil imagemagick güveniyorum.

Ben herhangi bir saldırı vektörü önlemek için kullanmak niyetinde önemli filetypes için kendi işleyicileri yazma öneririz.

Düzenleme: Ben sizin için bunu yapmak için bazı araçlar vardır PHP bakın.

Ayrıca, MIME türleri, kullanıcının tarayıcı olmasını dosya iddia nelerdir. Herkesin kolayca kötü dosyaları olacak sahte MIME başlık gönderirken, çünkü bu okuma ve kodunuzda onlara hareket kullanışlı ve yararlı olduğunu, ancak güvenli bir yöntem değildir. Bir PNG üzerinde barfing bir JPEG beklediğini kod tutmak için bir ön savunma hattı çeşit bulunuyor, ama birisi. Exe bir virüs gömülü ve JPEG adında eğer, MIME türü sahte olması için hiçbir neden yok.

PHP Kullandığınız PHP hangi sürümüne bağlı olarak, kendi MIME türünü belirlemek için dosya içeriğini okuma yolları bir çift var:

Eğer PHP 5.3 + çalıştırıyorsanız eğer Fileinfo functions bakabilirsiniz

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

Alternatif olarak, mime_content_type eski sürümleri için kontrol.

$type = mime_content_type($filepath);

Eğer gerçekten güvenli olmak istiyorsanız sadece dosya türünü doğrulama yeterli olmadığını unutmayın. Birisi, örneğin, ortak bir renderer bir güvenlik açığını kullanan bir geçerli bir JPEG dosyası yükleyebilir. Buna karşı korunmak için, bakımlı bir virüs tarayıcı gerekir.

PHP boyutu ve dosya türü gibi bilgileri tutan bir superglobal $_FILES olduğunu vardır. Tip bir başlık değil, bir uzatma çeşit meydana alınır gibi görünüyor, ama yanlış olabilir.

w3schools site üzerine bunun bir örneği yoktur.

Ben bir şans zaman kandırdın olabilir olup olmadığını test etmek için gidiyorum.

GÜNCELLEME:

Herkes muhtemelen bunu biliyordu, ama $ _FILES kandırdın olabilir. Ben bu şekilde belirlemek mümkün:

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

Temelde Unix, file komutu kullanır. Orada daha iyi yollar muhtemelen, ama ben bir süre PHP kullanılan değil. Ben genellikle mümkünse sistem komutları kullanmaktan kaçının.

hala sahte olabilir. Ben (ya da değil) otomatik olarak sunucuya yüklenen bir dosyayı koşamam sağlamak olacaktır.

Ben de bir virus/spy ware scanner var, ve sizin için çalışma yapalım istiyorum.

* Nix yılında, dosyanın ilk iki bayt ("sihirli sayı" bakın) size söyler. Windows, ... bazen bu ("başlık bilgisi") doğru olacaktır. Bu, sonuç olarak, bir O.Ş. bağımlı.

Genel Yürütülebilirler ilk bayt bir "imza" var; Ben gerçekten zor bir dosya türü gerçekten ne olduğunu anlamak için bile bulmak.

Hangi dosya türlerini bekliyorsunuz? Belki de ne beklediğiniz için uygun olduğunu kontrol edin ve her şeyi reddetmek olabilir.

Diğerleri zaten doğru bir çözüm olduğunu düşünüyorum FileInfo, sözü var, ama nedense o birini kullanamazsınız sadece durumda bu ekleyeceğiz. (Tüm?) En * nix dağıtımlar file denilen bir komutu içeren bir dosyanın çıktısı kendi türü üzerinde çalıştırdığınızda. Bu insan okunabilir formatta (varsayılan) veya MIME türü çıkışına bir anahtarı vardır. Eğer komut yüklenen dosya üzerinde bu programı çağırmak ve sonucu okuyun olabilir. Yine, bu tercih edilen bir yaklaşım değildir. Windows üzerinde iseniz, bu programı Cygwin aracılığıyla kullanılabilir.

Is checking the MIME type simply enough? I am assuming that changing the extension on a file doesn't change it's MIME type?

MIME türü burada gitmek için yeterince güçlü bir göstergesi midir?

Bugüne kadar yanıtların hepsi için teşekkürler.

Sadece yeterli MIME türünü kontrol ediyor? Ben bir dosya üzerinde uzantısını değiştirerek MIME türünün değişmez varsayarak yaşıyorum? MIME türü burada gitmek için yeterince güçlü bir göstergesi midir?

Bu gerçekten nasıl kullanıldığını bağlıdır.

  • Eğer indirme ve yükleme sağlamak eğer yürütmek değil, çünkü o zaman hiçbir şey önemli.
  • Bu web sunucusu tarafından işlenen eğer bu yorumların kalan en tabi olsa da, o, web sunucusu nasıl yapılandırıldığına bağlı olacak.
  • Bu bir görüntü varsa, ya olacak ekran, ya da değil, ya da görüntü kütüphane açıkları hedef. Ancak sadece.
  • Bir pdf dosyası gibi bir şey sunucu etkilemez ancak, dosyayı erişen kişinin bilgisayar olmayabilir.
  • Bu "çift tıklandığında" sanki, ve dosya uzantısı bile düşünülebilir - bu "sistemi ()" sonra geri OS davranış konum gibi bir işleve geçirilen olacak eğer.