php - وهمي - مهمل هكر




لماذا يخزن PHP الملفات التي تم تحميلها في موقع مؤقت وما الفائدة؟ (2)

حسنًا ، أنا جديد تمامًا في هذا المجال وأستعرض بعض البرامج التعليمية ووجدت أنه أثناء تحميل الملفات في PHP ، يقوم بتخزينها في موقع مؤقت.

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);

الآن لماذا لا يسمح PHP بتحميل الملفات مباشرة إلى الموقع المطلوب؟ لماذا يتم تخزينها في موقع مؤقت بامتداد .tmp وما الفائدة التي نحصل عليها من هذه الاستراتيجية؟


سؤال جيد. الإجابة المختصرة هي أنه يجب على PHP معالجة طلب HTTP بالكامل - ملء $_POST بالبيانات ، و $_FILES حسب الحاجة - قبل إعطاء التحكم في البرنامج النصي الخاص بك. نظرًا لعدم سيطرة البرنامج النصي الخاص بك إلا بعد المعالجة ، لا توجد طريقة لإخبار PHP عن مكان وضع بيانات الملف.

ولكن لماذا يفعل PHP بهذه الطريقة؟ حسنًا ، دعونا نلقي نظرة على HTTP POST مع بيانات الملف :

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

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

لذلك ، لضمان أن PHP يمكن أن يوفر لك جميع بيانات $_POST ، يجب أن يعالج PHP الطلب بأكمله. لذلك قد يكمل كذلك $_FILES super-global أثناء وجوده هناك.

الآن ، يمكن لـ PHP الاحتفاظ ببيانات الملف في الذاكرة ، لكن هذا قد يكون فكرة سيئة حقًا. فكر فيما سيحدث إذا احتاج PHP إلى تخزين ملف 100 ميجابايت قام المستخدم بتحميله. فجأة ، حصلت على زيادة قدرها 100 ميجابايت في خدمة RSS الخاصة بعملية Apache ، وهي في الحقيقة ليست جيدة جدًا - قد يكون تطبيق Apache لا يحتوي على مساحة كبيرة ، أو قد يتم تبديل Apache: معاناة المستخدمين لديك. لذا ، يقوم PHP بأفضل ما يلي: ضع هذا الملف المستلم في ملف مؤقت.

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

الآن ، يمكنك الاحتفاظ ببيانات الملف في قرص RAM ، للسرعة إذا كنت تريد ذلك. هذه طريقة جيدة إذا كنت لا تمانع في تكلفة البنية التحتية (على سبيل المثال ، الحفاظ على إعداد قرص RAM). لكن لاحظ أن هذا ليس مثل PHP الذي يحتفظ به في ذاكرة الوصول العشوائي نفسها: في هذا السيناريو ، يجب أن تحتوي عملية حاوية PHP (عادةً Apache أو بعض خوادم الويب الأخرى) على كومة لتخزين الملف (وهو ما قد لا يحدث ذلك). في هذا السيناريو ، تتم إدارة القرص RAM بواسطة kernel.


سببين إضافيين:

  1. إذا قررت عدم قبول الملف لسبب ما ، فسيتم تخزينه في مكان مؤقت ويُفترض أنه سيتم حذفه تلقائيًا في وقت ما.

  2. الأمان. لنفترض أنه تم تعيين PHP للتحميل إلى دليل يمكن الوصول إليه عبر الويب مثل / الصور. يمكن لشخص ما تحميل نوع من ملفات القرصنة ثم تنفيذها. من خلال وضع الملفات في دليل مؤقت أولاً (والذي عادةً لن يكون متاحًا للويب) ، يتيح لك PHP فحص الملف أولاً. على سبيل المثال ، من خلال معالجة الصور لإزالة أي تعليقات قد تحتوي على كود PHP.





file-upload