Nasıl PHP yüklenen dosyaların dosya türlerini kontrol etmek için?

4 Cevap php

PHP web sitesinde, onlar önermek tek gerçek kontrol kullanarak is_uploaded_file() ya da move_uploaded_file(), here. Tabii ki genellikle çeşitli nedenlerle için, kullanıcının herhangi bir dosya türü yükleme istemiyorum.

Bu nedenle, sık sık bazı "katı" mime tipi denetimi kullandık. Genellikle mim tipleri yanlış ve kullanıcıların dosya upload yapamazsınız çünkü Tabii ki bu çok kusurludur. Ayrıca, sahte ve / veya değişikliği çok kolaydır. Ve bütün bunlar, farklı onlarla her tarayıcı ve işletim sistemi fiyatları ile birlikte.

Başka bir yöntem tabii mime türü daha değiştirmek daha kolaydır uzantısını kontrol etmektir.

Eğer sadece resim istiyorsanız, gibi bir şey kullanarak getimagesize() çalışacaktır.

Ne diğer dosya türleri hakkında? PDF, Word belgeleri veya Excel dosyaları? Ya da sadece metin dosyalarını?

Edit: Eğer mime_content_type veya Fileinfo ve sistem ("dosya bi $ uploadedfile") size diğer seçeneklerin ne yanlış dosya türünü verir, yoksa orada?

4 Cevap

mime_content_type veya Fileinfo bir göz atın. Bu yerleşik bir PHP komutları dosyanın içeriğine bakarak bir dosya türünü belirlemek için. Ayrıca yukarıdaki iki sayfalarında yorumları kontrol, diğer bazı iyi öneriler var.

Şahsen ben aslında system("file -bi $uploadedfile") bir şeyi kullanarak iyi bir şans oldu, ama ben bu en iyi yöntem ise emin değilim.

IMHO, tüm MIME-tip kontrolü yöntemleri işe yaramaz.

MIME-türü var hangi var demek application/pdf. Standart yöntemler (böyle. %PDF- veya smth) bir PDF başlığı gibi görünen bir şey bulmak için çalışıyoruz ve onlar başarı üzerine 'Tamam, bir PDF dosyası bu gibi görünüyor' dönecektir. Ama aslında bu bir şey ifade etmez. Sadece %PDF-1.4 içeren bir dosya yükleyebilir ve MIME-çek geçecek.

Dosya beklenen bir MIME türü varsa Yani - bu her zaman başka sonuç tanımsız MIME-tipi çek geçecek.

Seni kabul edecek dosya türleri sabit beyaz liste olacak varsayalım.

Bu tür her biri için, onlar o biçiminin geçerli örnekler olduğunu doğrulamak için farklı teknikler kullanmak zorunda olacak.

Ilişkili iki soru vardır:

  • Bu doğru türü olabilir gibi kabaca görünüyor mu? (Bahsettiğiniz gibi JPEG için, sen başlıkları kontrol edebilir. Birçok Unix tabanlı formatları için, "sihirli çerez" kontrol edebilir.)

  • Aslında bu tür geçerli bir örnek (örn. herhangi bir XML benzeri bir formatta, bir DTD karşı doğrulamak olabilir.)

Ben cevap ZIP dosyaları ile karşılaştırıldığında PDF'ler için oldukça farklı olacak, çünkü her biçim için, sen, her biri için ayrı ayrı sorular sormak gerektiğini düşünüyorum.

: İşte file_mime_type iZend gelen fonksiyonudur

function file_mime_type($file, $encoding=true) {
    $mime=false;

    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $file);
        finfo_close($finfo);
    }
    else if (substr(PHP_OS, 0, 3) == 'WIN') {
        $mime = mime_content_type($file);
    }
    else {
        $file = escapeshellarg($file);
        $cmd = "file -iL $file";

        exec($cmd, $output, $r);

        if ($r == 0) {
            $mime = substr($output[0], strpos($output[0], ': ')+2);
        }
    }

    if (!$mime) {
        return false;
    }

    if ($encoding) {
        return $mime;
    }

    return substr($mime, 0, strpos($mime, '; '));
}