php رفع الملفات

سكريبت رفع الملفات

آخر تحيين: 06-06-2014

ثغرات رفع الملفات التعريف و الإستغلال php : التعابير العادية


استمارة رفع الملفات

رفع الملفات على الخادوم ، عملية سهلة . لا تتطلب سوى استمارة بسيطة ، ليست غريبة عنكم ، الشيء الذي يجب أن تتذكروه ، هو إضافة الصفة enctype . ثم سنستعمل دائما الطريقة POST لإرسال الملف .
كجميع الإستمارات ، الصفة action تضم الرابط إلى صفحة معالجة الملف . لنفترض أن صفحتنا تُسمّى "uploader.php" . و تتواجد في نفس المكان مع صفحة الإستمارة .
يمكننا أيضا إضافة حقل خفي "hidden" لتحديد حجم الملف المسموح برفعه . من باب مساعدة الزوار ، لا غير . و يجب إضافته قبل حقل الملف . في المثال أسفله حددت الحجم في "100 kb" . يمكنكم تغيير هذا الرقم ، حسب حاجتكم .

<form action="uploader.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="100000">
  <input type="file" name="milaf">
  <input type="submit" value="إرسال">
</form>

بعد اختيار الملف و نقركم على زر إرسال ، سيتم تخزينه في الذاكرة المؤقتة على الخادوم . و سيتم محوُه ، مباشرة بعد الإنتهاء من تنفيذ السكريبت . لهذا سنحتاج لنقله إلى مكان آخر ، لحفظه بصفة نهائية .

السكريبت المبدئي : uploader.php

عند ملأ الإستمارة و إرسالها إلى الخادوم ، يقوم php بتخزين مجموعة من البيانات التي تتعلق بالملف ، كإسم الملف و صيغته و حجمه ، في متغير محدد شامل يُسمّى : $_FILES . و هو جدول من نوع خاص ، لأنه يضم مفتاحين ، المفتاح الأول هو إسم حقل الملف ، في مثالنا سميناه "milaf". يمكن أن يكون أي إسم آخر . و المفتاح الثاني ، يمكن أن يكون : إما اسم الملف "name" أو حجمه "size" أو صيغته "type" ...

  • $_FILES["milaf"]["name"] - إسم الملف الذي تم رفعه
  • $_FILES["milaf"]["tmp_name"] - إسم النسخة المؤقتة للملف على الخادوم
  • $_FILES["milaf"]["type"] - صيغة الملف
  • $_FILES["milaf"]["size"] - حجم الملف بالبايتات "bytes "
  • $_FILES["milaf"]["error"] - الأخطاء الناجمة أثناء التحميل

السكريبت أسفله ، مثال لطريقة استعمال متغير الجدول "$_FILES" :

<?php
if ($_FILES["milaf"]["error"] > 0) {
  echo 'لم يتم تحميل الملف ، وذلك للأسباب التالية : <br>
         الأخطاء الناجمة : ' . $_FILES["milaf"]["error"] . '<br>';
} else {
  echo 'تم رفع الملف بنجاح . هذه بعض المعلومات عنه : <br>
       إسم الملف: '. $_FILES["milaf"]["name"] .'<br>
       الصيغة:   '. $_FILES["milaf"]["type"] .'<br>
       الحجم:     '. ($_FILES["milaf"]["size"] / 1024) .' kB<br>
       إسم النسخة المؤقتة للملف : '. $_FILES["milaf"]["tmp_name"];
}
?>

هذا السكريبت لا يقوم بأي شيء فعلي ، إذا استثنينا عرض بينات جدول $_FILES . سواء أثناء وجود خطأ أو أثناء النجاح في رفع الملف ، كما لاحظتم ، لم نستعمل سوى التعليمة echo في السكريبت . و لم نقم بأي معالجة له . و سيتم محوه من الذاكرة المؤقتة .
لحفظه و تخزينه بصفة نهائية . سنستعمل تعليمة جاهزة توفرها لغة php و هي : move_uploaded_file() : عبارة عن دالة ، تأخذ قيمتين :

move_uploaded_file ($filename , $destination )
$filename : إسم النسخة المؤقتة للملف على الخادوم : "tmp_name"
$destination : المكان الجديد الذي سنُخزن فيه الملف .

تقوم الدالة move_uploaded_file() . بنقل النسخة المؤقتة للملف على الخادوم إلى وجهة جديدة ، حيث سيتم تخزينه بصفة نهائية . هذه الوجهة هي عبارة عن ملف يجب أن تُنشؤوه بأنفسكم في المكان الذي تودونه على موقعكم ، لتبسيط الأمور ، أدعوكم لإنشاء ملف جديد في الملف الذي يضم موقعكم أو مشروعكم . قوموا بتسميته : مثلا "uploads" . يمكنكم إنشاءه يدويا أو باستخدام التعليمة mkdir() في صفحة المعالجة .

بالإضافة لنقل الملف إلى وجهته النهائية ، تقوم الدالة move_uploaded_file() أيضا بوضع أول حبة سُمسُم في ما يخص الحماية . إذ تقوم بالتأكد من أن الملف تم رفعه عن طريق "HTTP POST" . و هذا مهم ، حتى لا يُسمح للزائر الولوج إلى ملف على موقعكم ، لا ترغبون أن يطّلع عليه أحد .
إذا أخذتم بعين الإعتبار كل ما قيل ، سنحصل على سكريبت عملي ، يقوم برفع الملف ثم تخزينه في ملف "uploads" ، و سيكون شبيها بهذا :

<?php 
$upload_dir = 'uploads/';
$destination = $upload_dir . basename($_FILES['milaf']['name']);

if (move_uploaded_file($_FILES['milaf']['tmp_name'], $destination)) {
    echo "تم رفع الملف و تخزينه بنجاح :\n";
} else {
    echo "تم رفض الملف لأنه لا يستوفي الشروط :\n";
}

//print_r للتجربة ، يمكنكم عرض بيانات الملف باستعمال 

echo '<pre>   هذه بعض المعلومات عن الملف المعني :<br>';
print_r($_FILES);
echo '</pre>';
?>

السكريبت عملي ، يمكنكم إجراء التجارب . لكنه غير محمي ، فهو يتضمن مجموعة من الثغرات .

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

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