تأمين و حماية مواقع و سكربت رفع الملفات الى الموقع


من اهم المهام في مواقع الانترنت التفاعلية هي مهمة رفع او تحميل الملفات بمختلف انواعها الى سيرفر الموقع قد تكون هذه الملفات صور او فيديو وفي بعض الحالات يتطلب عمل الموقع رفع ملفات تنفيذية قد تكون ملفات مرفقة او مضغوطة او شروحات وغيرها الكثير مما قد يشكل خطر على عمل الموقع بشكل عام. وفي هذه الدراسة سنتطرق الى افضل حلول حماية وتأمين سكربت وتطبيقات رفع الملفات الى سيرفر الموقع بتفاصيل متقدمة تشمل جميع مراحل الحماية قبل الرفع من جهة المتصفح الى مرحلة معالجة الملف في مجلد الملفات المؤقتة الى مرحلة انشاء وكتابة الملف النهائي الى المسار الصحيح وفي النهاية مسح الملف والتأكد من خلوه من الفايروسات وملفات التجسس وغيرها من البرامج التي قد تسبب اضرار لمستخدمي الموقع مع الملاحظة ان هذه الدراسة تبحث في الاساسيات المشتركة مهما اختلف نظام التشغيل او خادم الموقع وكذلك لغة البرمجة المستخدمة PHP,JSP,ASP

اولاً:- مرحلة التدقيق والتأكد من الملف
عند اضافة مهمة رفع ملف الى موقع تكون البداية صفحة الانترنت HTML وبالتحديد فورم الرفع وهو عبارة عن حقل وزر امر ليتمكن الزائر من تصفح الجهاز الخاص به واختيار الملف ويكون ترميز html للفورم بهذا الشكل
<form enctype="multipart/form-data" action="upload.php" method="POST">
اختر الملف: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

عند ضغط زائر الموقع على الامر "اختر الملف "او Browse.. تظهر له نافذة اختيار ملف من الجهاز الخاص به بعد مرحلة تحديد الملف يمكن رفعة عنطريق الامر Upload File . الى هذه المرحلة لا يوجد اي تدقيق أمني يجب القيام به ما عدى بعض الاجراءات البسيطة لتحديد حجم الملف قبل عملية الرفع مثال 100KB بالاضافة الى تحديد خصائص اخرى مثل MAXLENGTH وغيرها.
<input type='hidden' name='MAX_FILE_SIZE' value='100000' />
تبدأ جميع مراحل التدقيق الأمني بعد تنفيذ الامر Upload File ولتوضيح جميع هذه المراحل يجب ان نعرف ماذا يحدث وبالتفصيل بين المتصفح وخادم الموقع الخاص بنا عند تنفيذ المستخدم امر رفع الملف. تبدأ هذه العملية بارسال طلب رفع الملف من المتصفح الى صفحة الرفع المحددة ويحتوي هذه الطلب على مقدمة تحتوي تفاصيل الطلب مثل نوع الطلب و اللغة المستخدمة ونوع المتصفح وغيرها ما يهمنا هو القسم الخاص بالملف المرسل للرفع وعادة ما يكون بهذا الشكل مثال ارسال طلب رفع ملف نوع صورة اسم الملف file2.gif
POST /upload.php HTTP/1.1
Host: 127.0.0.1
User-Agent: IE6
Content-Length: 156
Content-Type: multipart/form-data; boundary=xYzZY
Content-Disposition: file; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--BbC04y--
--AaB03x--

يوجد هنا 4 متغيرات مهمة وهي اسم الملف filename نوع الملف Content-Type وفي الاخير محتوى الملف contents of file2.gif بالاضافة للمتغير المهم الرابع وهو حجم البيانات او حجم الملف ويعرف ب Content-Length هذه 4 متغيرات هي التي ترسل في مختلف الانظمة والخوادم ولغات البرمجة ولذلك تجدها في لغة مثل php بهذا الشكل:-
1- اسم الملف FILES[‘file’][‘name’] وفي asp تجدة HttpPostedFile.FileName
2- نوع الملف FILES[‘file’][‘type’] وفي asp تجدة HttpPostedFile.ContentType
3- حجم الملف FILES[‘file’][‘size’] وفي asp تجدة HttpPostedFile.ContentLength
4- بيانات الملف وتمثل مسار وجود الملف المؤقت FILES[‘file’][‘tmp_name’]

وبذلك يمكن تقسيم اول مرحلة للتدقيق الامني بهذا الشكل
1- اسم الملف: مرحلة التدقيق على امتداد الملف
2- نوع الملف: مرحلة التدقيق على نوع الملف
3- حجم الملف: مرحلة التدقيق على حجم الملف
4- بيانات الملف: مرحلة التدقيق على محتوى الملف

اسم الملف : مرحلة التدقيق على امتداد الملف
في البداية ما هو امتداد الملف Filename extension هو ملحق اسم الملف وتمثل الاحرف بعد آخر نقطة مثل gif صورة او mpg فيديو exe برنامج ويستخدم امتداد الملف في انظمة الكمبيوتر لتوضيح نوع الملف ومحتواه. وبهذه الطريقة يمكن التدقيق على امتداد الملف المراد تحميلة الى خادم الموقع ومعرفة نوع الملف ومحتواه وبذلك يمكن تحديد الملفات المسموح برفعها مثل الصور او الفيديو او الملفات المضغوطة او ملفات اوفيس وفي هذا المثال توضيح لطريقة الاستفادة من معرفة امتداد الملف والسماح للمستخدم برفع الملفات الغير تنفيذية والتي تستخدمها اغلب المواقع
$file = $_FILES['uploadedfile'];
$allowedExtensions = array("jpg","jpeg","gif","png","doc","pdf","ppt","zip","rar","xls","pptx","docx","xlsx");
if (!in_array(end(explode('.',$file['name'])),$allowedExtensions)) {
echo 'عفواً...الملفات المسموح برفعها هي:jpg, jpeg, gif, png,doc,pdf,ppt,zip,rar';
exit(0);
}

نوع الملف : مرحلة التدقيق على نوع الملف
في هذه المرحلة سنقوم بمعرفة نوع الملف من خلال البيانات المرسلة من المتصفح قد يذكر البعض انه في المرحله السابقة تم تحديد نوع الملف فما هو المقصود بنوع الملف هنا ؟ والمرسل من قبل المتصفح في الحقيقة يمكن ان يكون هنالك اختلاف بسيط وسيتم توضيحه في هذه المرحله تعرفنا في المرحلة السابقة على امتداد الملف وهي الطريقة التي يتبعها نظام التشغيل لمعرفة انواع الملفات ومحتواها وهي اخر احرف وهكذا في شبكة الانترنت الوضع يختلف لأن امتداد الملفات المستخدم في الانظمة يختلف من نظام الا آخر مثل اختلافه في وندوز ولينكس وكذلك نوع نظام الملفات في انظمة التشغيل مثل FAT32 و NTFS تكون فيها امتدادات الملفات مختلف وغيرها من الاختلافات بين انظمة تشغيل الكمبيوتر هذه الفروقات صعبت عملية تحديد نوع الملف في شبكة الانترنت والمتصفحات والسبب ان بروتوكولات الانترنت تصل بين مختلف الاجهزة بمختلف انظمة التشغيل وظهرت الحاجه لاصدار نظام جديد لتعريف انواع الملفات ومحتواها لمختلف الانظمة عبر شبكة الانترنت وقد اطلق عليه MIME type او نظام وسائط الانترنت Internet media type.
وبذلك فإن متصفح الانترنت عندما يقوم المستخدم باختيار صوره من جهازة يتم ارسالها الى خادم الموقع يستخدم هذا النظام لتحديد نوعية الملف ويقوم بارسالها الى خادم الموقع مثال Content-Type: image/gif وتوجد انواع كثيرة للملفات مثل ملف مضغوط نوع zip يكون في انظمة التشغيل امتداد .zip وفي نظام وسائط الانترنت application/zip وتجد في هذه القائمة انواع الملفات المختلفه
http://www.intollogy.com/ar/research/mime type.html
يمكن الاستفادة من اعادة التدقيق على نوع الملف في هذه المرحله عن طريق انواع وسائط لانترنت او MIME type بالشكل التالي
$file =$_FILES['uploadedfile'];
if($file['type']=='application/zip'){
...
}else if($file['type']=='application/rar'){
...
}else if($file['type']=='application/pdf'){
...
}else if($file['type']=='image/gif'){
....
}else if($file['type']=='image/jpeg'){
....
}else if($file['type']=='image/png'){
.....
}else{
echo "عفواً...الملفات المسموح برفعها هي:jpg, jpeg, gif, png,doc,pdf,ppt,zip,rar");
exit(0);
}


حجم الملف : مرحلة التدقيق على حجم الملف
في هذه المرحله نقوم باجراء التدقيق على حجم الملف وهي مرحله مهمة لعمل الموقع ويمكن تحديد الحجم المناسب من خلال معرفة موارد السيرفر وقدرة استيعابة وكذلك من خلال اعدادات مترجمات لغة البرمجة مثل php ومعرفه الحد المسموح لحجم الملف وفي هذا الملف سنحدد حجم الملف 1MB
if ($file['size'] > 1024000) // 1024000 byte = 1 MB
echo ' خطا : حجم الملف اكبر من 1 ميجابايت';

وتوجد في هذه المرحله ملاحظة قد يغفل عنها الكثير وهي عدم الاكتفاء بالحجم الاعلى للملف وانما التدقيق على الحجم الادنى وهي مفيدة جداً
if ($file['size'] < 1) // = 0 byte
echo ' الملف الذي تم اختياره فارغ';


بيانات الملف : مرحلة التدقيق على محتوى الملف
في الحقيقة تعتبر أهم مرحله وعلى الرغم من ذلك لاينتبه اليها اغلب مبرمجي المواقع و بالتحديد مبرمجي PHP وسيتم توضيح هذه المرحله بشيء من التفصيل. في البداية اليك هذا المثال اذا كان هنالك موقع مختص برفع الملفات وقام مدير الموقع بطلب استشارة امنية لموقعه فستجد ان المعلومه الاولى التي سيحصل عليها وبنسبة 90% هي :- ان يكون الموقع مبرمج بلغة جافا ! ويمكن التاكد من ذلك بتصفح اكبر مواقع الملفات مثال 4shared لماذا ؟ السبب هو هذه المرحله لأن بنية لغة الجافا تعتمد على هذه المرحله فقط للتدقيق على الملف وهي المحتوى في حين مختلف اللغات تعتمد على المراحل السابقة. والسؤال هنا هل يمكن الاستفاده من مرحله التدقيق على الملف المعتمدة في لغة الجافا واستخدامها في لغات اخرى مثل PHP بكل تأكيد نعم. وهنا يمكن اضافه هذه المعلومة أنة لا يوجد مفهوم اسمه اختلاف امني بين لغات البرمجة وهذا الخطأ تقع فيه اكبر شركات الاستشارات الامنيه وسبب هذا المفهوم الخاطئ ان اغلب اللغات المتطورة مثل php و asp قامت بإضافة دوال ومتغيرات كثيرة لتسهيل عمل المبرمج ولكن هذه السهوله ادت الى ظهور عيوب امنيه. ولشرح جميع هذه المفاهيم بمثال عملي تجد في لغة PHP متغير باسم $_FILES يحتوي على جميع البيانات المرسلة وهذا لا تجدة في لغة جافا هذا المتغير $_FILES سهل عملية معرفة جميع تفاصيل الملف وجعلت المبرمج يعتمد عليه كما هو موضح في المراحل السابقة. ولكن هل تعلم ان جميع المراحل السابقة غير موثوقة 100% ماذا لو لم نستخدم متصفح انترنت وقمنا بارسال طلب الى الموقع بطريقة برمجية وغيرنا نوع الملف وحجمه ؟ في هذه المرحله بالتأكيد ننصحك بنسيان جميع معلومات متغير $_FILES وركز فقط على الدوال الاساسية في لغة PHP كما هو الحال في لغة جافا. اليك هذا المثال وهو ارسال طلب الى صفحة الموقع الخاصة برفع الملف والتي تعتمد على معلومات $_FILES لو قمنا بارسال هذه البيانات المزورة للطلب :-
POST /upload.php HTTP/1.1
Host: 127.0.0.1
User-Agent: IE6
Content-Type: multipart/form-data; boundary=AaZzXx
Content-Length: 155
--AaZzXx
Content-Disposition: form-data; name="userfile"; filename="shell.php"
Content-Type: image/gif
<?php
system($_GET['command']);
?>
--AaZzXx--

هل تعلم انه في متغير $_FILES سيظهر نوع الملف بانه نوع صورة وهو في الحقيقة شفرة برمجية وكذلك حجم الملف يمكن التلاعب به ولذلك سنقوم الآن بجميع مراحل التدقيق السابقة بالاعتماد على محتوى الملف وتجاهل خصائص الملف المرسلة من خلال متصفح الانترنت وهي الطريقة الافضل لمختلف اللغات والتي تجعلها متساوية من الناحية الامنية وطريقتها واحدة ومتشابهة. ذكرنا في ما سبق انه بعد قيام المستخدم اختيار الملف من جهازة لرفعة الى الموقع يقوم المتصفح بمعرفة نوع الملف وحجمة ومحتواه وارسالها الى سيرفر الموقع. تجاهل جميع المعلومات المرسلة من المتصفح ما يهمنا هو محتوى الملف وفي جميع خوادم وسيرفرات المواقع يتم تخزين الملف الذي تم رفعة في البداية في مجلد الملفات المؤقتة ويكون بلا نوع ولا امتداد فقط محتوى الملف وهذا ما يهمنا اول خطوة هي معرفة مسار الملف ويكون المسار مخزن في المتغير $file['tmp_name'] بمعنى هذه المعلومة الوحيدة التي نحتاجها من متغير $_FILES بعد ذلك نتبع الخطوات التالية حجم الملف : $filesize = filesize($file['tmp_name']); ونكون قد حصلنا على الحجم الفعلي للملف مهما تم التلاعب في الطلب المرسل الى خادم الموقع نوع الملف : لمعرفة نوع الملف بدقة عالية مهما تم التلاعب في امتداد الملف او نوع وسائط الانترنت نقوم في الخطوة الاولى بقرائة محتوى الملـــف
$handle = fopen($file['tmp_name'], 'r');
$filedata = fread($handle,$filesize);
fclose($handle);

الآن المتغير filedata يحتوي على كامل بيانات ومحتوى الملف المراد رفعه الى الموقع الخاص بنا في هذه المرحله يبدأ التدقيق والتحليل الامني المفصل وتكون البداية دائما مايعرف بتوقيع الملف File signature
ماهو توقيع الملف File signature ؟
من الجدير بالذكر انه كل ما تطورت الانظمة او اختلفت لغات البرمجة واردنا الوصول الى مراحل متقدمة في مجال الامن الالكتروني او التكنولوجيا بشكل عام فإننا نعود الى الصفر او بمعنى اصح الى 1 و 0 وهذا المفهوم هو ما نبتعه في انتولوجي وهو دمج خبرات مبرمجي لغات متقدمة مثل لغات الآله والاسمبلي والسي مع خبرات مطوري المواقع وقواعد البيانات والتصميم لدينا وينتج عن ذالك اعمال ومنتجات متقدمة في هذا المجال
توقيع الملف File signature : هو ترميز يستخدم داخل الملف للتحقق من نوع الملف معظمها يتكون من 2-4 بايت في بداية محتوى الملف والنوع الاخر من التواقيع يكون عبارة عن مجموعة بايتات عبارة عن كتل موزعة في مختلف بيانات الملف البداية او المنتصف او النهاية وقد استخدم توقيع الملف في مجال الامن والحماية منذ بداية عصر التكنولوجيا ولازال يستسخدم الى الآن ويمثل اليه عمل جميع برامج مكافحة الفايروسات يتكون غالبا التوقيع من ترميز هيكس قد يحتوي على رموز في الغالب ليس لها احرف مفهومة مثال توقيع ملف zip يجب ان يحتوي اول سطر من البيانات على 4 بايت تمثل التوقيع التالي 50 4B 03 04 وبهذا الشكل لمختلف الملفات تجد قائمة لمختلف انواع الملفات وتواقيعها في الرابط
http://www.intollogy.com/ar/research/file_signatures.html
بعد قرائة محتوى الملف في المتغير filedata تكون جميع البيانات عبارة عن 0 و 1 وهي لغة الآله بعد قرائة هذه البيانات يتم تحويلها الى ترميز هيكس او النظام الست عشري HEX عن طريق الداله :-

$filedata = bin2hex($filedata);
نظام الهيكس هو عبارة عن ارقام من 0-9 بالاضافة الى احرف من A-F ولانه يحتوي على احرف ونرغب بمقارنتها مع تواقيع الملفات يجب تحديد حجم الاحرف اما ابقائها كما هي صغيره او جعلها جميعها كبيرة uppercase عن طريق الداله
$filedata = strtoupper($filedata);
الآن متغير filedata يحتوي جميع بيانات الملف بترميز هيكس HEX وهو جاهز لعملية البحث عن تواقيع الملفات في محتواه وتحديد نوع الملف ويتم ذلك عن طريق دوال النصوص بهذه الطريقة ومثال على ذلك ملف نوع ZIP وتوقيعه هو الازاحه او سطر 0 توقيع هيكس 504B0304 :-
if (substr($filedata,0,4*2) == '504B0304')
{
echo '<H1>الملف الذي تم اختياره نوع ZIP</H1>';
return true;
}

تلاحظ انه ولغرض التوضيح في داله substr استخدمنا 4*2 ولم نضع 8 لانه في الدال النصيه كل حرف او رقم يعتبر 1 بايت بينما في التواقيع او ترميز هيكس كل زوجين من الارقام او الاحرف يعتبر 1 بايت بمعنى الحجم الكلي للتوقيع 4 بايت واضفنا *2 للتوافق مع داله النصوص مثال اخر لتحديد نوع ملف صورة PNG
if (substr($filedata,0,8*2) == '89504E470D0A1A0A')
{
echo '<H1>الملف الذي تم اختياره نوع PNG</H1>';
return true;
}

ملاحظة مهمة في تدقيق نوعية الصور يمكن اختصار التواقيع عن طريق داله معرفة نوع الصورة وهي تعمل بنفس عمل مقارنة التواقيع
$imageinfo = getimagesize($file['tmp_name']);
//check 1 = GIF, 2 = JPG, 3 = PNG
if($imageinfo[2]!=1 and $imageinfo[2]!=2 and $imageinfo[2] !=3){
echo ("نوعية الصورة التي تم اختيارها غير صحيح النوعيات المسموح بها jpg, jpeg, gif, png");
}

مثال التعرف على تواقيع ملفات برامج المكتب مايكروسوفت اوفيس الاصدارات القديمة DOC,PPT,XLS وغيرها
if (substr($filedata,0,8*2) == 'D0CF11E0A1B11AE1')
{
echo '<H1>الملف الذي تم اختياره احد مجموعه برامج اوفيس DOC,PPS,PPT,XLS..</H1>';
return true;
// ملاحظة يمكن ايضا تحديد نوع الملف بالتحديد عن طريق مايعرف بلوك 512
// ملف اكسل Excel09 08 10 00 00 06 05 00 (hex) السطر 513
}

بعد ان تعرفنا على مرحلة التدقيق على نوع الملف من خلال التواقيع وجب التنويه انه يمكن استخدام جميع وسائل التدقيق لانتاج تطبيقات ذات جودة عالية من الناحية الامنية بمعنى استخدام التدقيق على الملف من خلال الامتداد + التاكد مرة اخرى من خلال نوع الملف المرسل من قبل المتصفح وفي النهاية التاكد من صحه المعلومات السابقة عن طريق توقيع الملف لكشف اي محاولة للتلاعب في البيانات المرسلة ومنع المستخدم من تكرار هذه المحاولات حتى لو لم يتم رفع الملف. وتوجد افكار عديدة في هذه المرحله ومثال تعطيل اكواد لغة برمجة مثل php في حال تجاوز جميع مراحل التدقيق مع ملاحظة تعطيل short tag في ملف php.ini مثل <? ?> :-
$filedata = preg_replace("/\<\?php/is","< php", $filedata);

ثانياً:- مرحلة مسح الملف من الفايروسات
الى الآن يوجد الملف الذي تم رفعه في مجلد الملفات المؤقتة tmp وجميع اجراءات التدقيق تتم هنا ولم يتم نقله الى مسار الموقع الخاص بعد ان قمنا بالتدقيق في المراحل السابقة وتأكدنا من صحه وسلامه الملف بقيت نقطه اخرى وهي سلامه اجهزة زوار الموقع وعدم تعرض اجهزتهم لفايروسات او ملفات تجسس قامو بتنزيلها من خلال موقعنا.
والفكرة العامة للمسح الامني هي ان برامج الفايروسات تصدر دوال خاصة للمسح عن الفايروسات يمكن ان تستخدم من خلال لغات برمجة مختلفة خارج برنامج الفايروسات ومثال على مسح ملفات الموقع والتأكد من خلوها من الفايروسات Anti Virus Scan باستخدام برنامج مكافحة الفايروسات ClamAV ومكتبة دعم تطبيقات ال PHP هي php-clamavlib وتقدم الدوال التاليه cl_info, cl_scanfile, cl_setlimits ومثال على استخدامها:-

cl_setlimits(5, 1000, 200, 0, 10485760);
if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'We have Malware: '.$malware.'<br>ClamAV version: '.clam_get_version();

عند هذه المرحله قد يذكر البعض هذه الملاحظة اننا ذكرنا سابقا انه لايوجد مفهوم يسمى اختلاف امني بين لغات البرمجة وعند هذه المرحله تظهر معلومات جديدة تؤكد انه يوجد اختلاف امني بين لغات البرمجة والدليل ان لكل برنامج للمسح عن الفايروسات محرك يعرف بمحرك المسح عن الفايروسات Antivirus Scan Engine هذه المحركات في اغلب برامج مكافحة الفايروسات لا تدعم لغة مثل PHP او ASP وغيرها من اللغات المتطورة في حين انك تجد دعم كامل لها للغة جافا مثل Java API Symantec Scan Engine في الحقيقة هذه المعلومات صحيحة ولكنها قديمة بعض الشيء وليست دقيقه والدليل على ذلك ظهور ما يعرف ب Metascan وهو نظام يقدم دوال API للمسح على الفايروسات لمختلف لغات البرمجة ويقوم بالمسح في اكثر من 8 محركات لاشهر برنامج مكافحه الفايروسات. وبذلك يمكن ان نؤكد انه لا يوجد مقهوم اختلاف امني بين لغات البرمجة ولكن هنالك اختلافات في الامكانيات والسرعة والاداء بكل تأكيد وهذا المجال سوف نخصص له دراسات تفصيلية لمقارنة الفروقات بين اللغات ومتى يمكن ان تحدث.
ثالثاً:- مرحلة انشاء وكتابة الملف
في هذه المرحله وبعد انتهاء جميع مراحل التدقيق سنقوم بنقل الملف من مجلد الملفات المؤقتة وتسميته واعادة كتابتة في مسار الموقع قد لا تقل اهمية هذا المرحلة عن المراحل السابقة لحماية وتأمين سكربت رفع الملفات وتوجد لها قواعد عديدة وهي تشبه الى حد ما المرحله السابقة ومن اهم قواعد مرحلة انشاء وكتابة الملف هي :-

القاعده الاولى لا تستخدم اسم الملف او امتداده المرسل من قبل المتصفح
ومثال على ذلك في حال ارسال المستخدم صورة وكان اسم ملف الصورة وامتداده بهذا الشكل file.gif في هذه الحاله لا تستخدم اسم او حتى امتداد الملف ودائما تكون القاعدة بهذا الشكل اسم الملف يكون تكوينه تلقائيا مع ملاحظة عدم تكرارة لمنع حدوث اخطاء وجود ملف بنفس الاسم والفائدة الثانية هو منع الوصول الى ملفات النظام عن طريق تغيير وتزوير الطلب المرسل لخادم الموقع وافضل طريقة لانشاء داله تكوين اسم الملف الجديد هي بمعرفه بعض الحقائق اولها ان يكون مسار الملف + اسم الملف بالكامل لا يتجاوز طول 255 حرف وهذا الخطا لا ينتبه اليه الكثير والخطوة الثانية هي الا يتكرر اسم الملف ولذلك تكون افضل طريقة هي الاعتماد على داله منظمة مثل الوقت بالاضافة لداله عشوائية ونحن في انتولوجي غالبا ما نستخدم المعادلة التالية
$newfilename = $user_id.'_'.time().'_'.rand(1,9999);
وتمثل رقم او معرف المستخدم الذي قام برفع الملف والوقت باجزاء من الثانية بالاضافة الى رقم عشوائي يصعب عملية تكرار الملف الى هذه المرحله قمنا بانشاء اسم الملف فقط المرحله الثانيه يتم انشاء امتداد الملف وكما ذكرنا سابقا لا يتم استخدام امتداد الملف المرسل من طرف متصفح الانترنت وانما يتم اضافته برمجيا الى اسم الملف الذي قمنا بإنشائة وبهذا الشكل
 // Zip
if (substr($filedata,0,4*2) == '504B0304')
{
$newfilename .='.zip';
}
// PDF
if (substr($filedata,0,4*2) == '25504446')
{
$newfilename .='.pdf';
}

بعد الانتهاء من مراحل التدقيق تعرفنا على مرحله تكوين اسم الملف بالاضافه الى امتداده بعد هذه المرحله نقوم بانشاء الملف الجديد بالاسم الجديد وكتابتة
القاعدة الثانية كتابة الملف الجديد وليس نقله
قد يستخدم اغلب مطوري المواقع داله move_uploaded_file بعد الانتهاء من مراحل التدقيق وانشاء اسم ومسار الملف الجديد وفي الحقيقة هذه الداله سهلت عملية انشاء وكتابة الملف الجديد ولكنها اختصرت الكثير من الخطوات المهمة ونحن قد لا نستخدمها ونفضل استخدام دوال كتابة الملف التقليدية لنستطيع التحكم الكامل بهذه العملية بهذا الشكل
$handle = fopen($newfile, 'w+');
fwrite($handle, $filedata);
fclose($handle);

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

رابعاً:- مرحلة حماية مسار رفع الملف - مجلد التخزين
لنفترض اننا اخترنا المسار التالي لتخزين وكتابة الملفات بعد عملية الرفع var/html/www/upload ومن خلال هذا المسار يتضح ان الملفات يتم تخزينها بداخل الموقع في حين ان بعض الملاحظات الامنيه تنصح بتخزين الملفات خارج محتوى الموقع بمعنى قبل مجلد او مسار صفحات الموقع هذه الملاحظة مفيدة والسبب في ذلك عدم قدرة مستخدم الموقع الوصول اليها او تنفيذها ولكن هذه الطريقة ينتج عنها بعض الاخطاء الامنيه لانها تعتمد على قرائه الملف برمجيا وعرضة للمستخدم. ونحن في هذه الدراسة سندمج الفكرتين معا بمعنا انشاء مجلد التخزين بداخل محتوى الموقع وفي نفس الوقت سنقوم ببعض الاجراءات لمنع الوصول اليه او تنفيذ الملفات التي يحتويها ملف التخزين والحل بكل تأكيد ملف htaccess وسنقوم بإنشائة داخل مجلد التخزين واضافه التعليمات التالية
## السماح للملفات التالية فقط للوصول اليها
deny from all
<Files ~ "^\w+\.(gif|jpg|png|jpeg|zip|rar|xls|pdf|doc|ppt)$">
order deny,allow
allow from all
</Files>
## تعطيل جميع الملفات التنفيذية في المجلد
Options -Indexes -ExecCGI
RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off

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

خامساً:- مرحلة التدقيق على التكرار للوقاية من هجمات Dos
وفي النهاية حماية سكربت رفع الملفات من تكرار الطلبات التي قد تأثر على عمل الموقع بشكل عام وجميع وسائل حماية المواقع من هجمات رفض الخدمه Dos قد تكون متشابهة بمعنى انشاء قاعدة بيانات لأمن الموقع ويتم تسجيل جميع الطلبات القادمة الى الموقع ورقم ال اي بي IP للمستخدم وتحليلها لمنع تكرار الطلبات بمعنى تحديد عدد الملفات التي يمكن ان يرفعها المستخدم او زائر الموقع ونحن ننصح بشهدة بعمل قاعدة بيانات تعمل على سجل log لجميع الطلبات القادمة للموقع ونعتبر هذه العملية جزء اساسي من اجزاء برمجة الموقع.

خلاصة الدراسة هي ان تتم عملية رفع الملفات الى الموقع بعدة مراحل هي:-
1- مرحلة التدقيق على امتداد الملف Filename extension
2- مرحلة التدقيق على نوع الملف MIME type
3- مرحلة التدقيق على نوع الملف من خلال التوقيع File signature
4- مرحلة التدقيق على حجم الملف من خلال المتصفح + محتوى الملف
5- مرحلة مسح الملف من الفايروسات
6- مرحلة انشاء وكتابة الملف
7- القاعده الاولى لا تستخدم اسم الملف او امتداده المرسل من قبل المتصفح
8- القاعدة الثانية كتابة الملف الجديد وليس نقله عن طريق move_uploaded_file
9- مرحلة حماية مسار رفع الملف - مجلد التخزين
10 -مرحلة التدقيق على التكرار للوقاية من هجمات Dos


INTOLLOGY Information technology (IT). Company office Address : ABUDHABI UAE Phone:+97125590442 Fax:+97125590449