1. تحميل الملف
من أجل تحميل مستخدم العميل الملفات ، يجب أن نقدم نموذجًا في واجهة المستخدم لإرسال طلبات لتحميل الملفات. نظرًا لأن الملف الذي تم تحميله عبارة عن بيانات خاصة ، على عكس بيانات النشر الأخرى ، يجب علينا تعيين ترميز خاص للنموذج:
انسخ الرمز كما يلي: <form action = "appload.php" method = "post" enctype = "multipart/form-data"> </form>
قد لا تكون على دراية بسمات envype أعلاه ، لأن هذا يتم تجاهله غالبًا. ومع ذلك ، إذا كان طلب نشر HTTP يحتوي على كل من البيانات العادية والبيانات الشبيهة بالملفات ، فيجب إضافة هذه السمة ، والتي يمكن أن تحسن التوافق مع المتصفحات المختلفة.
بعد ذلك ، يتعين علينا إضافة حقل إلى النموذج لتحميل الملف:
انسخ الرمز كما يلي: <input type = "file" name = "factionment">
قد تتصرف حقول الملف أعلاه بشكل مختلف في المتصفحات المختلفة. بالنسبة لمعظم المتصفحات ، يتم تقديم الحقول المذكورة أعلاه في مربع نص مع زر تصفح. وبهذه الطريقة ، يمكن للمستخدم إدخال مسار الملف في مربع النص بنفسه ، أو تحديد الملف المراد تحميله من القرص الثابت المحلي من خلال زر التصفح. ومع ذلك ، في سفاري Apple ، يبدو أنه يمكن استخدام التصفح فقط. بالطبع ، يمكنك أيضًا تخصيص نمط مربع التحميل هذا لجعله يبدو أكثر أناقة من النمط الافتراضي.
أدناه ، من أجل شرح أفضل كيفية التعامل مع تحميلات الملفات ، قدم مثالًا كاملاً. على سبيل المثال ، يتيح النموذج التالي للمستخدمين تحميل المرفقات إلى الخادم المحلي الخاص بي:
انسخ الرمز كما يلي: <p> يرجى تحميل مرفقك: </p>
<form action = "appload.php" method = "post" enctype = "multipart/form-data">
<type type = "file" name = "Affectment">
<type type = "إرسال" القيمة = "مرفق التحميل">
</form>
نصيحة: يمكنك تعيين القيمة القصوى التي تسمح بتحميل الملفات من خلال epload_max_filesize في php.ini. بالإضافة إلى ذلك ، هناك أيضًا post_max_size يمكن استخدامه لضبط بيانات النموذج القصوى المسموح بها. عن طريق تعيين هذا الحقل. ومع ذلك ، لاحظ أن قيمة الأخير يجب أن تكون أكبر من السابق ، لأن الأول ينتمي إلى جزء من بيانات النموذج من الأخير.
الشكل 1. نموذج التحميل الموضح في Firefox
عند تقديم هذا النموذج ، سيتم إرسال طلب HTTP إلى expload.php. من أجل إظهار المعلومات المحددة التي يمكن استخدامها في تحميل.
نسخة الكود كما يلي:
رأس ('نوع المحتوى: نص/عادي') ؛
print_r ($ _ files) ؛
دعنا نقوم بتجربة.
انسخ الرمز على النحو التالي: صفيف
((
[المرفق] => صفيف
((
[الاسم] => boy.jpg
[type] => Image/JPEG
[TMP_NAME] => D: /XAMPP/TMP/PHP1168.TMP
[خطأ] => 0
[الحجم] => 11490
)
)
ما ورد أعلاه هو جميع المعلومات حول الملف الذي تم تحميله حاليًا في المصفوفة العالمية بعد تحميل الملف. ومع ذلك ، هل يمكننا التأكد من أن هذه المعلومات آمنة ، ماذا لو تم العبث بالاسم أو المعلومات الأخرى؟ نحتاج دائمًا إلى أن نكون متيقظين بشأن المعلومات من العملاء!
كل جزء من طلب HTTP المحدد
من أجل فهم تحميل الملف بشكل أفضل ، يجب علينا التحقق من المعلومات المحددة الواردة في طلب HTTP الذي أرسله العميل. كان المرفق الذي قمت بتحميله من قبل هو شعار هذه المدونة ، لأنه صورة ، ليس من المناسب لنا القيام بالتجارب المذكورة أعلاه. لذلك ، قمت بتحميل ملف نص test.text مرة أخرى ، والذي يحتوي على المحتوى التالي:
نسخة الكود كما يلي:
360W
360Days
حياة صبي على شبكة الإنترنت
تمام. الآن أقوم بتحميل هذا الملف النصي وإخراجه في upload.php:
نسخة الكود كما يلي:
صفيف
((
[المرفق] => صفيف
((
[name] => test.txt
[النوع] => النص/عادي
[TMP_NAME] => D: /XAMPP/TMP/PHP51C0.TMP
[خطأ] => 0
[الحجم] => 40
)
)
دعنا نلقي نظرة على طلب نشر HTTP الذي أرسله المتصفح ذي الصلة (لقد حذفت بعض الرؤوس الاختيارية):
نسخة الكود كما يلي:
post /upload.php http /1.1
المضيف: www.360weboy.me
المرجع: http://www.360weboy.me/
multipart/form-data ؛ ------------------------------------------------- -----------------------
طول المحتوى: 234
----------------------------------- 24464570528145
disposition: form-data ؛
نوع المحتوى: النص/عادي
360نا
360Days
حياة صبي على شبكة الإنترنت
---------------------------------- 4464570528145-
هناك العديد من الحقول في تنسيق الطلب أعلاه ، اسم الملف ونوع المحتوى Test.txt ، ونص تنسيق الملف الذي تم تحميله/عادي (يمثل ملف نصي). بعد ذلك ، نرى أن السطر التالي هو المحتوى المحدد في الملف الذي تم تحميله.
2. تعزيز السلامة
من أجل تحسين الأمان في تحميل الملفات ، نحتاج إلى التحقق من TMP_NAME والحجم في صفيف $ _files العالمي. من أجل التأكد من أن الملف الذي يشير إليه TMP_NAME هو بالفعل الملف الذي تم تحميله من قبل المستخدم على العميل ، بدلاً من الإشارة إلى شيء مثل /etc /passwd ، يمكنك استخدام الدالة is_uploaded_file () في PHP لإصدار الحكم التالي :
نسخة الكود كما يلي:
$ filename = $ _files ['Attachment'] ['tmp_name'] ؛
if (is_uploaded_file ($ filename)) {
/ * ملف تم تحميله.
}
في بعض الحالات ، بعد تحميل المستخدم الملف ، قد يتم عرض محتوى الملف الذي تم تحميله بنجاح إلى المستخدم للعرض ، وبالتالي فإن فحص الرمز أعلاه مهم بشكل خاص.
شيء آخر للتحقق هو نوع MIME من ملف التحميل ، وهو حقل نوع مجموعة الإخراج في upload.php أعلاه. ما قمت بتحميله في المثال الأول هو صورة ، وبالتالي فإن قيمة $ _files ['المرفق'] ['type'] هي "Image/JPEG". إذا كنت تخطط لقبول الصور من نوع MIME فقط مثل Image/PNG و Image/JPEG و Image/GIF و Image/X-PNG و Image/P-JPEG على جانب الخادم ، يمكنك استخدام رمز مشابه لما يلي (مجرد إلقاء نظرة على ذلك) أمثلة ، يجب أن تتبع رموز محددة ، مثل الأخطاء ، الآليات في نظامك):
نسخة الكود كما يلي:
$ ALLE_MIMES = صفيف (
"الصورة/PNG" ،
"Image/X-PNG" ،
"الصورة/gif" ،
"Image/JPEG" ،
"Image/PJPEG"
) ؛
$ image = $ _files ['factionment'] ؛
if (! in_array ($ image ['type'] ، $ allow_mimes)) {
يموت ("آسف ، تنسيق الملف الذي تم تحميله غير دقيق ؛ نحن نقبل فقط ملفات الصور.") ؛
}
// تابع معالجة ملفات الصور التي تم تحميلها
كما ترون ، لقد تأكدنا من أن نوع الملف للملف يفي بمتطلبات جانب الخادم. ومع ذلك ، لا يكفي أن يمنع المستخدمون الخبيثون من تحميل ملفات ضارة أخرى ، لأن المستخدمين الخبيثين يمكن أن يتظاهروا بأنهم يتنكرون من نوع MIME. على سبيل المثال ، قام المستخدم بعمل صورة JPG ، وكتب بعض رمز PHP الضار في بيانات تعريف الصورة ، وحفظها كملف مع اللاحقة المسمى PHP. عند تحميل هذا الملف الضار ، سيتم فحصه بنجاح من جانب الخادم لنوع MIME ، والذي يعتبر صورة ، وسيتم تنفيذ رمز PHP الخطير في الداخل. البيانات الوصفية للصورة المحددة تشبه ما يلي:
نسخة الكود كما يلي:
اسم الملف: Image.jpg
حجم الملف: 182007 بايت
تاريخ الملف: 2012: 11: 27 7:45:10
القرار: 1197 × 478
التعليق: passthru ($ _ post ['cmd']) ؛
يمكننا أن نرى أنه يتم إضافة رمز PHP إلى حقل التعليق في بيانات تعريف الصورة. لذلك ، من الواضح أنه من أجل منع المواقف الخطرة المماثلة ، يجب أيضًا إجراء فحص ضروري لتمديد الملف الذي تم تحميله. يعزز الرمز التالي الرمز السابق للتحقق من نوع MIME:
نسخة الكود كما يلي:
$ ALLE_MIMES = صفيف (
'Image/png' => '.png' ،
'Image/x-png' => '.png' ،
"الصورة/gif '=>' .gif" ،
"Image/JPEG '=>' .jpg '،
"Image/Pjpeg" => '.jpg'
) ؛
$ image = $ _files ['factionment'] ؛
if (! array_key_exists ($ image ['type'] ، $ allow_mimes)) {
يموت ("آسف ، تنسيق الملف الذي تم تحميله غير دقيق ؛ نحن نقبل فقط ملفات الصور.") ؛
}
// احصل على اسم الملف مع اسم اللاحقة المحذوفة:
$ filename = substr ($ image ['name'] ، 0 ، strpos ($ image ['name'] ، '.')) ؛
// أضف اسم لاحقة
$ fileName. = $ allow_mimes [$ image ['type']] ؛
// استمر في معالجة الملفات التي تم تحميلها
من خلال الكود أعلاه ، نضمن أنه حتى إذا كان Metafile الذي تم تحميله يحتوي على رمز PHP ، فسيتم إعادة تسمية ملف الصورة كملف باسم لاحقة وتنسيق الصورة ، وبالتالي لن يتم تنفيذ رمز PHP فيه. لن يكون للرمز أعلاه أي تأثير سلبي على الصور العادية التي تم تحميلها.
بعد إجراء الخطوات العديدة المذكورة أعلاه لتحسين اختبارات الأمان ، إذا كنت ترغب فقط في حفظ الملف الذي تم تحميله في دليل محدد ، يمكنك استخدام الوظيفة الافتراضية Move_Uploaded_file من PHP لتنفيذها:
نسخة الكود كما يلي:
$ TMP_FILENAME = $ _files ['Attachment'] ['tmp_name'] ؛
$ filename = '/path/to/attachment.txt' ؛
if (move_uploaded_file (tmp_filename ، $ filename)) {
!
}
قد تضطر أيضًا إلى الحد من حجم الملف الذي تم تحميله ، حتى تتمكن من استخدام وظيفة Filedize للحصول على حجم الملف الذي تم تحميله ، وإصدار الأحكام وإجراء مزيد من المعالجة.
حسنًا ، دعنا نكتب هذا الآن حول تحميل الملف. آمل أن تكون هذه المقالة التمهيدية مفيدة لك.