لائحة الطعام
مجاني
تحقق في
الرئيسية  /  النصيحة / PHP كحتوى لتحديد نوع الملف. ملف توسيع الملف PHP

PHP كحتوى لتحديد نوع الملف. ملف توسيع الملف PHP

السطر الأخير هو قريب. يمكنك استخدام: إذا (MIME_CONTENT_TYPE (ملفات _ $ _ ["fuload"] ["TMP_NAME"]) \u003d\u003d "صورة / GIF") (...

في الحالة عندما أعمل الآن، تقدمي $ _files .. ["النوع"] تقارير نفسها ك "نص / CSV"، في حين أن mime_content_type () و FINFO () تقرير "نص / عادي". وفقا ل Deceze، $ _Files .. [نوع "] مفيد فقط لمعرفة نوع العميل الذي يعتبره ملف.

تحذير : الإجابة التالية لا تحقق في الواقع من نوع الملف. انه يتحقق فقط الاسم. هو - هي غير مناسب للحصول على أهداف الأمن الحقيقي.

تحرير: لا تستخدم هذه الطريقة، لأنه لا يؤدي فحص الأمن. أترك هذه الإجابة هنا حتى لا يرتكب أحد نفس الخطأ الذي أحاول القيام به.

جربت ما يلي، وقد عمل بالنسبة لي:

$ المسموح بها \u003d صفيف ("GIF"، "PNG"، "JPG"، "PDF")؛ $ اسم الملف \u003d $ _files ["input_tag_name"] [اسم "]؛ ext \u003d pathinfo ($ اسم الملف، pathinfo_extension)؛ إذا (! in_array ($ Ext، $ المسموح بها)) (ECHO "خطأ"؛)

في PHP 5.5، يمكنني استخدام هذه الميزة لتلقي نوع ملف وتحقق مما إذا كانت هناك صورة:

وظيفة getfiletype (return image_type_to_mime_type)؛) // احصل على نوع الملف $ file_type \u003d getFileType ("المسار / إلى / الصور / test.png")؛ echo $ file_type؛ // يطبع الصورة / PNG // 1. تحتوي جميع الصور على نوع MIME بدءا من "صورة" // 2. لا توجد أنواع أخرى غير صورة MIME تحتوي على سلسلة "صورة" في ذلك

ثم يمكنك القيام به:

إذا (stropos ($ نموذج فيليه، "صورة")! \u003d\u003d خطأ) (// هذه صورة)

هذا سيناريو بسيط مع صف واحد، والتي غالبا ما أستخدمها.

$ Image \u003d "/var/www/core/temp/image.jpg"؛ $ ISISIGE \u003d تنفجر ("/"، mime_content_type ()) \u003d\u003d "الصورة"؛

في الأساس، يمكنني استخدام MIME_CONTENT_TYPE () للحصول على شيء مثل "صورة / jpg"، ثم اخترته "/" والتحقق من العنصر الأول من الصفيف لمعرفة ما إذا كان يقول "الصورة".

أتمنى أن يعمل!

بالطبع، يمكنك التحقق مما إذا كانت صورة مع exif، ولكن أفضل طريقةأعتقد أنه يجب القيام به مع FINFO كما يلي:

$ المسموح بها_TYPES \u003d صفيف ("تطبيق / PDF"، "صورة / JPEG"، "Image / PNG")؛ fileinfo $ \u003d finfo_open (fileinfo_mime_type)؛ تم اكتشاف $ Depe \u003d Finfo_file ($ fileinfo، $ _files ["Datei"] ["TMP_NAME"])؛ إذا (! in_array (تم اكتشافه $_type، $ المسموح بها_TYPES)) (يموت ("يرجى تحميل PDF أو صورة")؛) finfo_close ($ fileinfo)؛

بالإضافة إلى Deceze، يمكنك أيضا Finfo () التحقق من نوع MIME من الملفات دون صورة:

$ finfo \u003d finfo جديد ()؛ $ filemimetype \u003d $ finfo-\u003e الملف (مسار $. $ filename، fileinfo_mime_type)؛

الوظيفة المحددة PrefilePreviews () ($ ("الإدخال"). تغيير (وظيفة (). تغيير ("حاوية معاينة البيانات")؛ إذا (prvcnt) (if.files && this files) الملفات) (var reader \u003d filereader جديد () ؛ Reader.Onload \u003d وظيفة (ه) (var img \u003d $ (" ")؛ img.attr (" SRC "، E.TARGET.RESULT)؛ IMG.Error (وظيفة () ($ ($ ($ ($ (prvcnt) .html (")؛)؛ $ (prvcnt) .html ("") ؛ img.appendto (prvcnt)؛ reader.readasdataurl (this.files)؛))))؛)؛) $ (الوثيقة) .Ready (وظيفة () (الوظيفة Prepiews ()؛)؛

كما تقوم بمعالجة الحالة عند تحديد ملف مع نوع غير صالح (على سبيل المثال، PDF)

8 ردود 8.

لا تستخدم أبدا $ _Files .. [نوع "]. المعلومات الواردة فيها لا يتم التحقق منها على الإطلاق، إنها قيمة مستخدم. تحقق من النوع بنفسك. exif_imagetype هو عادة اختيار جيد:

$ AllodTypes \u003d صفيف (Imagetype_png، Imagetype_jpeg، Imagetype_gif)؛ $ detedededype \u003d exif_imagetype (ملفات $ _ ["fuload"] ["tmp_name"])؛ $ Error \u003d! in_array ($ detabledype، $ allodtypes)؛ حجم $ \u003d getemagragesize (اسم الملف $)؛ إذا ($ حجم \u003d\u003d\u003d False) (رمي استثناء جديد ("($ اسم الملف): صورة غير صالحة.")؛) إذا ($ حجم\u003e 2500 | $ حجم\u003e 2500) (رمي استثناء جديد ("($ اسم الملف) : صورة كبيرة جدا ")؛) إذا (! $ img \u003d imagecreatefromstring (file_get_contents (file_get_contents ($ filename)) (رمي استثناء جديد (" اسم الملف $ ("($ اسم الملف): محتوى الصورة غير صالح.")؛

التحقق من GetSimagesize () يمنع بعض الهجمات DOS، لأننا لا نحتاج إلى محاولة تنفيذ OmageCreateFromString () من كل ملف يقدمه المستخدم الذي ليس ملف أو ملف كبير جدا. لسوء الحظ، وفقا لمستندات PHP، لا يمكن الاعتماد عليها للتحقق من محتوى نوع المحتوى.

أخوذة أخيرا () أخيرا، في محاولة لفتح الملف كصورة - إذا كان ناجحا - لدينا صورة.

2017-07-12 09: 05: 07Z

هذا هو برنامج نصي بسيط خط واحد في كثير من الأحيان.

$ Image \u003d "/var/www/core/temp/image.jpg"؛ $ ISISIGE \u003d تنفجر ("/"، mime_content_type ()) \u003d\u003d "الصورة"؛

عادة ما أستخدم mime_content_type () للحصول على شيء مثل "صورة / jpg"، ثم انشقها مع "/" وتحقق من العنصر الأول من الصفيف لمعرفة ما إذا كانت "الصورة".

أتمنى أن يعمل!

2017-10-18 22: 53: 49Z

في PHP 5.5، يمكنني استخدام هذه الميزة للحصول على نوع من الملفات وتحقق مما إذا كانت الصورة:

وظيفة getfiletype (return image_type_to_mime_type)؛) // احصل على نوع الملف $ file_type \u003d getFileType ("المسار / إلى / الصور / test.png")؛ echo $ file_type؛ // يطبع الصورة / PNG // 1. تحتوي جميع الصور على نوع MIME بدءا من "صورة" // 2. لا توجد أنواع أخرى غير صورة MIME تحتوي على سلسلة "صورة" في ذلك

ثم يمكنك القيام به:

إذا (stropos ($ نموذج فيليه، "صورة")! \u003d\u003d خطأ) (// هذه صورة)

قائمة كاملة من أنواع Pantomime: http: //www.sitePoint .com / أموال الويب / ميث نوع كامل /

2015-06-11 16: 47: 46Z

الخط الأخير قريب. يمكنك استخدام: إذا كان (MIME_CONTENT_TYPE (ملفات $ _ ["fuload"] ["tmp_name"]) \u003d\u003d "صورة / GIF") (... P\u003e

في حالة ما أعمل الآن، تقارير بلدي $ _Files .. [نوع "] تقارير نفسها ك" نص / CSV "، في حين أن mime_content_type () وتقارير Finfo () تقرير" نص / عادي ". كما هو موضح Deceze، $ _Files .. [نوع "] مفيد لمعرفة فقط نوع العميل الذي يعتبره الملف.

2018-08-09 19: 38: 14Z

تحذير: الإجابة التالية لا تحقق في الواقع من نوع الملف. انه يتحقق فقط الاسم. هو - هي غير مناسب للحصول على أهداف الأمن الحقيقي.

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

جربت ما يلي، وقد عملت بالنسبة لي.

مهمة تحديد التوسع تحدث في التطوير في كثير من الأحيان - هنا، وتحليل الملفات المتاحة، والبحث عن الملف. في العمل مع الملفات على الخادم، هناك أيضا حل متكرر احفظ الملف ليس مع اسم المصدر، ولكن الوجهة كملم اسم القيمة الحالية لخادم Timestamp. الحلول هذه المهمة موجودة كثيرا لغات البرمجة المختلفة. على الرغم من أن بعض القرارات، فإن أولا وقبل كل شيء يتبادر إلى الذهن، في بعض الأحيان يجب أن يكون المكرر بسبب مجموعة متنوعة من أسماء الملفات التي يمكن أن تكون فقط. للحصول على ملف يدعى "MyFile.txt"، يمكنك تقديم بأمان لتقسيم السلسلة إلى أجزاء مفصولة بالنقطة وتأخذ آخر واحد. ولكن ماذا تفعل مع الملفات "my.file.txt" أو إذا لم يتم تحديد التمديد "myfile"؟

في هذه المقالة، النظر في مثل هذه الحلول.

للراحة، سيتم تعيين اسم الملف في متغير سلسلة:


$ اسم الملف \u003d "myfile.txt"؛

// خيارات اسم الملفات الأخرى
$ اسم الملف \u003d. "ملف"؛ // غير مؤشر التوسع
$ filename \u003d "my.file.txt"؛ // نقطة في اسم الملف
$ filename \u003d "dir / myfile.txt"؛ // اسم الملف يشير إلى دليل
?>

أبسط وأكثرها ملاءمة، في رأيي، الحل لاستخدام وظيفة Pathinfo ()، والتي سترجع الصفيف المرتبط الذي يحتوي على الاسم الكامل والتوسع والدليل للملف. بعد ذلك، يبقى لسحب العنصر الضروري في الصفيف.



$ file_info \u003d pathinfo (اسم الملف $)؛
عودة $ file_info ["التمديد"]؛
}


?>

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


echo Pathinfo ($ اسم الملف، Pathinfo_Extension)؛
?>

سيعود كل من المتغيرين بشكل صحيح قيمة تمديد "TXT"، باستثناء الحالة التي لم يتم تحديدها فيها التمديد. حيث لا توجد ملحقات، سيتم إرجاع سلسلة فارغة.

هذا الحل متاح ل PHP، بدءا من الإصدار 4.0.3.


إذا، نظرا لإصدار PHP أو أي سبب آخر، فإن هذا الحل غير متوفر، يمكنك استخدامه الحل التقليدي - انهيار اسم ملف الملف من جانب النقاط، معتقدين أن المؤامرة الأخيرة ستكون توسعا.


وظيفة get_file_extension (اسم الملف $) (
نهاية العودة (تنفجر ("."، اسم الملف $))؛
}

echo get_file_extension (اسم الملف $)؛
?>

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

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

22

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

لحجم الملف، يمكنك بالفعل استخدام $ _Files ["ImageFile"] ["الحجم"]؛ هذا أمر طبيعي، أعتقد، لكنك ستعرف ذلك فقط عند تحميل الملف. ومع ذلك، لا وسيلة حقيقية التحقق من ذلك قبل التنزيل، أخشى ...

يمكنك العثور على رمز JS لأول علامة تمديد مسبقة مسبقا قبل تحميل الملف، ولكن لا يزال يتعين عليك التحقق من جانب الخادم، لأن كل ما يتم القيام به على جانب العميل في جوهره غير آمن.

لست متأكدا من أنه يمكنك القيام بنفس الشيء في حجم الملف، على الرغم من ...

يمكن لبعض المتصفحات دعم حقل مخفي يسمى max_file_size (انظر وثائق تحميل الملفات)؛ ولكن ليس متأكدا من أنه مدعوم حقا (لم يسبق له مثيل من قبل، في الواقع، لذلك، ربما لا :-()

كملاحظة، ربما ترغب في تكوين Upload_Max_Filesize، بحيث تسمح لك بالتحميل كبير على الأقل كما تريد (بشكل افتراضي، يتم تثبيته عادة في 2 ميغابايت، لذلك يجب أن يكون ذلك بالترتيب)

2

PHP هو لغة السيناريو على جانب الخادم، وإذا كانت الصور على جانب العميل، لا يمكنك التحقق من حجمها قبل التنزيل عبر PHP .

2

تحتاج إلى شيئين:

فحص التمديد الخاص بك يعتمد على التسجيل:

إذا كان ($ strtolower ($ ext \u003d\u003d "jpg")) (// القيام بأشياءك)

تحقق مما إذا كان الملف يحتوي بالفعل على الصورة. أسهل طريقة للقيام بها هي fileinfo:

$ finfo \u003d finfo_open (fileinfo_mime_type)؛ echo finfo_file ($ finfo، اسم الملف $)؛ $ finfo_close ($ finfo)؛

طريقة بديلة للتحقق هي ما إذا كان الملف محملا بالفعل في مكتبة الصور ك GD. إذا كان يمكن تنزيل الملف بنجاح، فهذه صورة.

لا تنسى jpeg images. قد يكون إما .jpg، أو extension.jpeg.

3

هذا ما أفعله:

إذا كانت ($ _ ملفات ["UserPicture"] ["خطأ"] ["خطأ"] ["خطأ"] \u003d\u003d 0) (// ملف تم تحميله موافق، لذلك "موافق" للمتابعة بفحص الملف. $ uploaded_type \u003d exif_imagetype ($ _ الملفات [" "] [" TMP_NAME "])؛ // ما لدينا الآن هو رقم يمثل نوع الملف الخاص بنا. تبديل ($ uploaded_type) (الحالة" 1 ": $ uploaded_type \u003d" gif "؛ break؛ case" 2 ": $ uploaded_type \u003d "JPG"؛ كسر؛ حالة "3": $ uploaded_type \u003d "PNG"؛ كسر؛))

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

ما هو نوع ملف MIME؟ كيفية تحديد نوع ملف MIME بي أتش بي؟ كيفية تثبيت وحدة fileinfo وتكوين خادم محلي، تجميع دنفر.

mime - القياسية التي تصف ناقل الحركة أنواع مختلفة إدخال المعلومات البريد الإلكترونيبالإضافة إلى مواصفات لتشفير المعلومات وتنسيق الرسائل بطريقة يمكن إرسالها عبر الإنترنت.

تمر matchast.

على هذا النحو، يعتمد تعريف نوع MIME من الملف على امتداده (ملف). كما تفهم، هذا تعريف مشروط إلى حد ما من نوع MIME. على سبيل المثال، ملف Image.jpg (حتى لو كان شيئا آخر)، على ملحق JPG، سيتم تعريف نوع MIME: Image / JPEG. بالطبع، يمكنك تحليل محتوى الملف وبناء عليه لتحديد نوع MIME الصحيح، ولكن لا يتم تضمين هذا الحل في ملاحظتي.

الشيء الرئيسي هو أنه الآن تحتاج إلى فهم هو الحاجة إلى الخادم magic.mime. الملف حيث يتم وصف أنواع MIME. على هذا النحو، فإنه جزء من PHP. يحدث ذلك في مجلدات Apache Server، يمكنك العثور على هذا الملف. بشكل عام، الذي يبحث عنه، سيجد. من الناحية النظرية، اكتشف أين يمكن اعتبار السحر. يمكن اعتبار قيمة الخيار mime_magic.magicfile. من php.ini. على سبيل المثال:

ومع ذلك، لن يعيد هذا الخيار أي شيء، ومع ذلك، حاول.

تجدر الإشارة إلى أنه من أجل تحديد نوع ملف MIME، يحتوي وحدة FileINFo في PHP. بمعنى آخر، يمكنك دائما التنقل، هل لديك الفرصة لمعرفة أم لا، من خلال وجود هذه الوحدة. على سبيل المثال:

لذلك إذا كانت الوحدة النمطية، فهي فرصة ستعمل كل شيء. في الحالات القصوى، يمكنك تحديد المسار إلى ملف Magic.mime الخاص بك.

ممارسة

معظم. طريقة بسيطة تعاريف ملف نوع MIME إلى أدوات PHP هو استخدام وظيفة PHP Mime_Content_Type () PHP من وحدة FileINFo. على سبيل المثال:

نتيجة لذلك، يجب أن نحصل على سلسلة: صورة / JPEG.وبعد بالطبع، إذا كان الملف Image.jpg موجود، فإن وحدة FileINfo متصلة وسحر.

لاحظ أن قيمة وظيفة MIME_CONTENT_TYPE () يجب أن تكون وظيفة المسار الكامل واسم الملف، والتي استخدمتها تصميم DirName (__ File__). "image.jpg". يجب أيضا أن نتذكر أن هذه الميزة تعتبر عفا عليها الزمن (ENG. إهمال) وفي المستقبل سيتم استبعادها من PHP. بديل يمكن أن يكون بمثابة حل مكتوب باستخدام وظائف PHP من نفس وحدة FileInfo:

هنا، تقوم الدالة FINFO_OPEN () بإنشاء مورد ملف fileinfo ($ finfo). مع الأخذ في الاعتبار FileINFO_MIME_TYPE ثابت متاح في نسخة PHP لا تقل عن 5.3.0، سنتمكن من الحصول على نوع من الملفات (الملفات).

أعتقد أنه من الواضح بالفعل أن Finfo_File Finfo_File () PHP-Finfo_File () باستخدام مورد FileINFO ($ Finfo) بإرجاعنا للحصول على معلومات ل ملف محدد ($ اسم الملف). في حالتنا، هذا نوع MIME: صورة / JPEG.

حسنا، إذا لم يحضر كل ما سبق النتيجة، فيمكنك كتابة المحلل المحلل الخاص بك. هناك أيضا العديد من الخيارات هنا. واحد من هؤلاء هو محلل ملف magic.mime. لا يهم أين هو، الشيء الرئيسي الذي كان عليه.

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

التثبيت والإعداد

دعنا نذكرك مرة أخرى: نحن نتحدث عن خادم محلي، جمعية دنفر. كما تفهم، سنحتاج إلى الرجوع إلى ملف php.ini. في مجلدي: C: \\ WebServer \\ USR \\ Local \\ Php5 \\. في ذلك، نحتاج إلى توصيل ملحقين: php_fileinfo.dll و php_mime_magic.dll. على سبيل المثال، لذلك:

امتداد \u003d امتداد php_fileinfo.dll \u003d php_mime_magic.dll

أرسم الانتباه إلى حقيقة أن بيانات التوسع موجودة. لدي لهم في المجلد: C: \\ WebServer \\ USR \\ Local \\ Php5 \\ ext \\.

mime_magic.debug \u003d على mime_magic.magicfile \u003d "C: \\ Webserver \\ USR \\ Local \\ apache \\ conf \\ magic.mime"

لاحظ أنه بالنسبة للخيار Mime_Magic.magicFile الذي تحتاجه لتسجيل الطريق الكامل والاسم. migic.mim.mime.وبعد هذا هو في الواقع كل شيء.