كيفية التحقق من أنواع الملفات من الملفات التي تم تحميلها في PHP?

StackOverflow https://stackoverflow.com/questions/310714

سؤال

على PHP الموقع الوحيد الحقيقي التحقق من أنها تشير إلى استخدام is_uploaded_file() أو move_uploaded_file(), هنا.بالطبع كنت عادة لا تريد المستخدم تحميل أي نوع من الملفات ، لمجموعة متنوعة من الأسباب.

بسبب هذا, أنا غالبا ما تستخدم بعض "صارمة" mime نوع التحقق.بالطبع هذا معيبة جدا لأنه في كثير من الأحيان أنواع mime خاطئة و لا يمكن للمستخدمين تحميل الملفات الخاصة بهم.بل هو أيضا من السهل جدا وهمية و/أو تغيير.و مع كل ذلك, كل المتصفح و نظام التشغيل يتعامل معها بشكل مختلف.

طريقة أخرى للتحقق من التمديد الذي هو بالطبع أسهل من تغيير نوع mime.

إذا كنت تريد فقط الصور, استخدام شيء من هذا القبيل getimagesize() سوف تعمل.

ماذا عن أنواع أخرى من الملفات ؟ ملفات pdf, Word أو Excel الملفات ؟ أو حتى النص فقط الملفات ؟

تحرير: إذا لم يكن لديك mime_content_type أو Fileinfo و نظام("file-bi $uploadedfile") يعطيك نوع الملف غير صحيح, ما هي الخيارات الأخرى هناك ؟

هل كانت مفيدة؟

المحلول

ونلقي نظرة على mime_content_type أو <وأ href = "http://php.net/manual/en/function.finfo-file.php" يختلط = "noreferrer"> Fileinfo . يتم بناؤها في هذه أوامر PHP لتحديد نوع ملف من خلال النظر في محتويات الملف. أيضا التحقق من التعليقات على صفحتين المذكورة أعلاه، هناك بعض الاقتراحات الجيدة الأخرى.

وشخصيا لقد كان حظا سعيدا باستخدام شيء ما system("file -bi $uploadedfile") أساسا، ولكن لست متأكدا إذا كان هذا هو أفضل وسيلة.

نصائح أخرى

وIMHO، جميع طرق فحص MIME من نوع غير مجدية.

ويقول كنت قد حصلت الذي ينبغي أن يكون MIME من نوع application/pdf. طرق معيارية تحاول أن تجد شيئا يشبه رأس PDF (%PDF- أو شىء. من هذا القبيل) وأنهم سيعودون "حسنا، يبدو أن هذا هو ملف PDF" على النجاح. ولكن في الواقع هذا لا يعني أي شيء. يمكنك تحميل ملف يحتوي على %PDF-1.4 فقط وسوف تمر MIME الاختيار.

وأعني إذا كان الملف متوقعة MIME من نوع - سيكون دائما تمرير الاختيار MIME من نوع وإلا فإن النتيجة هي غير محددة

أفترض كنت ستكون لدينا ثابت الأبيض-قائمة أنواع الملفات التي سوف تقبل.

لكل من هذه الأنواع أنت ذاهب إلى استخدام تقنيات مختلفة للتحقق من أنها صالحة أمثلة هذا الشكل.

هناك نوعان من الأسئلة ذات الصلة:

  • يبدو تقريبا مثل أنه قد يكون الحق في النوع ؟ (على الحياة السياسية في فرنسا, هل يمكن أن تحقق الرؤوس كما ذكرت.العديد من المستندة إلى Unix صيغ ، يمكنك التحقق من السحر "كوكي".)

  • هو في الواقع صالحة سبيل المثال من هذا النوع (على سبيل المثالأي XML-مثل شكل يمكن التحقق من صحة ضد DTD.)

أعتقد أن لكل شكل ، يجب عليك أن تسأل أسئلة منفصلة لكل واحدة ، لأن الإجابة ستكون مختلفة تماما عن ملفات Pdf مقابل ملفات ZIP.

واعتدت mime_content_type متوافق مع PHP 5.2، لأنني لا أستطيع استخدام لا Fileinfo (يتطلب PHP 5.3) ولا system()، وهذا هو تعطيل من قبل مزود بلدي. على سبيل المثال، ومعرفة ما اذا كان ملف هو ملف نصي ذلك:

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

ويمكنك رؤية مثال كامل في بلادي "دليل PHP ودليل فرعي المستمع والمشاهد وتنزيل ملف" على العنوان التالي: http://www.galgani.it/software_repository/index.php

if(isset($_FILES['uploaded'])) {
    $temp = explode(".", $_FILES["uploaded"]["name"]);

    $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods");

    $extension = end($temp);
    if( in_array($extension, $allowedExts)) {
       //code....

    } else {
        echo "Error,not Documentum type...";
    }
}

وهنا هو file_mime_type وظيفة من iZend:

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, '; '));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top