ما هي أفضل الممارسات التجارية في التحقق من صحة اسم الملف؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

لدي "معفى" وأتساءل ما هي أفضل الممارسات للأعمال.

أنا أستخدم التحميل لتحميل الصور. الآن أحتاج إلى التحقق من صحة اسم الملف قبل حفظ الملف.

لقد نظرت إلى حلول مختلفة، ولكن لا يمكن أن تنزل إلى حل جيد واحد.

هنا هي معاييس بلدي:

  • يجب أن يكون اسم الملف في أحرف صغيرة
  • يمكن أن يحتوي اسم الملف فقط على Charaters [A-Z0-9_
  • يجب أن أكون قادرا على إعادة تسمية الملف

كيف يمكنك الذهاب حول إذا كان اسم الملف my.file(name).jpeg ?

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

لدي الوظائف التالية التي تساعد قليلا:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

تحديث 1.
أنا أستلم الملف من خلال $ _files. هذا يعطيني البيانات التالية:

  • $ _files ["ملف"] [اسم "الاسم"] - اسم الملف الذي تم تحميله
  • $ _files ["ملف"] ["النوع"] - نوع الملف الذي تم تحميله
  • $ _files ["ملف"] ["الحجم"] - الحجم في بايت الملف الذي تم تحميله
  • $ _Files ["ملف"] ["TMP_NAME"] - اسم النسخة المؤقتة من الملف المخزن على الخادم
  • $ _files ["ملف"] [خطأ "] - رمز الخطأ الناتج عن تحميل الملف

تحديث 2.
أنا فقط وجدت شيئا. يمكن أن أستخدم getemagrages. والتي سوف ترجع مجموعة من 7 عناصر. واحدة من هذه العناصر [2] هي imagetype_xxx.

لذلك أحاول استخدام هذا الرمز:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

ولكن فقط إرجاع الرقم 2 ...

(حاولت أيضا استخدام Exif_imageType، لكنها تحصل فقط خطأ PHP: اتصل على وظيفة غير محددة.)

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

المحلول

تحقق اسم الملف مع regexp. استخدم معلومات حول Mimetype. حفظ الملف على الخادم مع اسم MD5. تخزين اسم الملف الحقيقي على DB.

نصائح أخرى

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

أفترض أنك تتحقق من صحة أسماء الملفات لاستخدام أسماء ملفات تنزيل لاحقا.

على الرغم من أنه سيكون من الرائع الحفاظ على أسماء الملفات لأنها من أجل المستخدم، من وجهة نظر تقنية، فإن نهجك أصدر الصوت.

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

Ä = ae
Ö = oe
Ü = ue

بينما يبدو أن الدول الاسكندنافية سهولة

Ä => a
Ö => o
Ø => o

وما إلى ذلك وهلم جرا.

ثم هناك الأحرف المعلمة المختلفة É á ...

إسقاط تلك التي تؤدي تماما إلى عناوين URL التي تبدو حقا BD و LK Strng في عنوان BWSR BR.

هذا يجب أن تفعل كل ما تريد:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

وكما أوضحه Pekka، إذا كنت ترغب في استبدال جميع الإكسدان في اسم الملف، فيمكنك استخدام الوظيفة التالية:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

لا أعتقد أنك يجب أن "التحقق من صحة" اسم الملف، يجب عليك فقط "إصلاح" إذا لم يكن في التنسيق الذي تريده. لماذا رفض ملف لمجرد أن شخصا ما تمتص في تسمية ملفاتهم، أو لديه بعض الشخصيات غير العادية هناك؟ أيضا، إذا كنت تعمل مع الصور، يمكنك استخدام getimagesize كما ذكرت للتأكد من أنها في الواقع صورة تم تحميلها (يجب أن تفشل إذا لم تكن صورة).

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