كيف يمكنني معرفة إذا ما كان يتصنع نوع الملف?(PHP)

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

سؤال

أنا البرمجة شيء التي تتيح للمستخدمين تخزين المستندات و الصور على الويب ، ليتم تخزينها و استرجاعها في وقت لاحق.عندما للمستخدمين تحميل الملفات إلى الخادم, PHP يقول لي ما نوع الملف وهو يقوم على التمديد.ولكن أخشى أن المستخدمين يمكن إعادة تسمية ملف مضغوط كما somezipfile.png و تخزينه ، وبالتالي إبقاء ملف مضغوط على الخادم.هل هناك أي طريقة لفتح الملف المحمل و "الاختيار" لمعرفة ما اذا كان حقا هو من نوع الملف?

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

المحلول

ماجيك عدد . إذا كنت تستطيع قراءة بايت القليلة الأولى من ملف ثنائي يمكنك معرفة أي نوع من الملفات هو عليه.

نصائح أخرى

وتحقق من FileInfo PECL التمديد لPHP، والتي يمكن أن تفعل MIME عمليات البحث السحر بالنسبة لك.

ونوع من. معظم أنواع الملفات لديها بعض بايت مخصصة لوضع العلامات عليها بحيث لا تضطر إلى الاعتماد على التمديد. و http://wotsit.org هو مورد كبير للعثور على هذا الخروج لنوع معين.

إذا كنت على نظام يونيكس، وأعتقد أن الأمر ملف لا تعتمد على التمديد، لذلك يمكن أن قذيفة من أصل لذلك إذا كنت لا تريد لكتابة رمز بايت تدقيق.

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

وحدات البايت الثمانية الأولى من ملف PNG يحتوي دائما على القيم التالية:

و(عشري) 137 80 78 71 13 10 26 10

و(عشري) 89 50 4E 47 0D 0A 1A 0A

و(ASCII C تدوين) \ 211 P N G \ ص \ ن \ 032 \ ن

إذا كنت تتعامل فقط مع الصور، ثم 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 ليست صورة.

والعديد من أنواع الملفات يكون " أرقام السحر " في بداية ملف التعرف عليها، يمكن أن تقرأ بعض بايت من الجزء الأمامي من الملفات ومقارنتها إلى قائمة الأرقام السحرية المعروفة.

في نظام يونيكس، واستولت على الإخراج من الأمر 'الملف' ينبغي أن توفر المعلومات الكافية.

لإجابة محددة عن الكيفية التي يمكن أن تفعل ذلك بسرعة في PHP، وتحقق من هذا السؤال: <لأ href = "https://stackoverflow.com/questions/134833/how-do-i-find-the-mime نوع من واحد في الملفات مع فب # 134893 "> كيف يمكنني العثور على التمثيل الصامت نوع من ملف مع بي؟

كملاحظة جانبية أنا واجهت مشكلة مشابهة حيث كان لي أن تفعل بلدي نوع التحقق.الواجهة الأمامية واجهة طلبي كان في فلاش.كانت الملفات التي يتم تمريرها من خلال فلاش النصي php.عندما كنت تحاول أن تفعل نوع MIME التحقق باستخدام php نوع عاد دائما كان التطبيق/octetstream لأنه كان قادما من فلاش.

كنت قد لتنفيذ الأرقام السحرية نوع النموذج.أنا ببساطة إنشاء ملف xml التي عقدت نوع الملف جنبا إلى جنب مع بعض تحديد أنماط وجدت في بداية الملف.بمجرد الملف إلى ملقم فعلت بعض نمط مطابقة مع ملف xml ومن ثم قبول أو رفض الملف.لم يلاحظ أي انخفاض أداء إما مما كنت أتوقع.

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

وكذلك تحديد نوع الملف، قد ترغب في احترس من الملفات مع الملفات الأخرى جزءا لا يتجزأ أو إلحاق لهم. وسوف يتطلب ذلك للأسف على تحليل أكثر عمقا من محتويات الملف من مجرد استخدام "الأرقام السحرية".

وعلى سبيل المثال، <وأ href = "http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/" يختلط = "نوفولو noreferrer" > http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (وهذا نوع معين من مخبئه البيانات يمكن عمل بسهولة في جميع أنحاء بواسطة تحميل وresaving في ملف جديد بيانات الصورة الفعلية .. والبعض الآخر سوف يكون أكثر صعوبة.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top