Yüklerken filetypes Denetleme ve tarayıcı bağımlılık sorunları

3 Cevap php

Ben bir PHP File Uploader inşa ediyorum ve güvenliği ile ilgili bazı sorunları var. Örneğin ben ". Php" dosya yükleme izin vermek istemiyorum. Ben bildiğiniz gibi dosya türünü kontrol etmek için tek yol $_FILES['file']['type'] ile ve bunun değeri tarayıcı bağlıdır.

Ben birden fazla tarayıcı ile kontrol ve düzenli bir php dosyası seçerken farklı tarayıcılarda bu değerleri geri bulundu.:

firefox: application/x-download
chrome: text/plain
safari: text/plain
IE: text/plain
opera: application/octet-stream

Ben de. Txt dosyaları düzenli ile aynı deneyi denedim ve tüm tarayabilir mime türü olarak text/plain return.

Yani burada sorun ben. Txt dosyası yüklemek izin vermek istiyorsanız, ben. Php dosya yüklemeleri önlemek için ne yapmalıyım, değil mi?

3 Cevap

Aşağıdaki işlevi kullanın:

function Mime($path)
{
    $result = false;

    if (is_file($path) === true)
    {
        if (function_exists('finfo_open') === true)
        {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);

            if (is_resource($finfo) === true)
            {
                $result = finfo_file($finfo, $path);
            }

            finfo_close($finfo);
        }

        else if (function_exists('mime_content_type') === true)
        {
            $result = preg_replace('~^(.+);.*$~', '$1', mime_content_type($path));
        }

        else if (function_exists('exif_imagetype') === true)
        {
            $result = image_type_to_mime_type(exif_imagetype($path));
        }
    }

    return $result;
}

Bu, herhangi bir dosyanın doğru mime türünü dönecektir.

Istemci gönderir bilgilere güvenmeyin. Istemci gönderir Hatta medya türü sahte olabilir.

PHP dosyalarını izin vermek istemiyorsanız, sadece dosya uzantısı .php ile dosya izin vermek veya bunu değiştirmek gerekmez .txt:

if (strtolower(strrchr($_FILES['file']['name'], '.')) == '.php') {
    // has file extension .php
}

Aşağıdakileri deneyin. Bu FAR aptal kanıtı ama onun hızlı bir kontrol değil. (Bu istemci makinede olduğu gibi) herhangi bir şey etiketli. php bloke edecek bu yüzden 'do_evil.php.txt' gibi bir şey varsa onu izin AMA (kod notları okuyun) olacak

$file_ext = substr($_FILES['userfile']['name'], -3);
if($file_ext == 'php') {
   //REJECT FILE
}
else {
   // allow upload and once the file has been upload to the temp directory
   // have a peice of code move the file to the final location and rename 
   // the file and specify a new file extension, using $file_ext as the extension
   // so even if the file was 'do_evil.php.txt' when it comes to rest at the 
   // final location it will be 'do_evil.txt' and thus treated by the server as a
   // text file and not PHP
}

I iniş sonuçları ile geçmişte yukarıdaki kullandık. Bu hiçbir şekilde kurşun kanıtı, ama en az olmalıdır yardım. i bütün bunlar, bu hasta onu aramaya gitmek gerekir ama eğer hiçbir vaat i bulabilirsiniz bulunmayan bazı kod ortalıkta olabileceğini düşünüyorum