آخر تحديث

فتح أرشيف صنعه شخص آخر

بقلم

أضفنا رفع المجلدات هذا الأسبوع. استغرق فك الضغط بعد ظهر يوم واحد. واستغرق تقرير ما يجب رفضه بقية الأسبوع.

أفلت مجلدًا أو ملف ZIP هنا

أفلت الملفات أو مجلدًا هنا، أو اخترها.

HTML وReact والمجلدات وملفات zip وPDF. المجلد الذي ليس فيه index.html يُفتح على الصفحة التي تبدو أنها البداية.

المدونة · نُشر أولًا بالإنجليزية في .

ملف ZIP ليس مجرد بيانات. إنه مجموعة تعليمات من شخص غريب عن المكان الذي تُكتب فيه الملفات ومقدار الذاكرة التي تُستخدم، والسلوك الافتراضي لكل مكتبة فك ضغط هو أن تنفّذها.

أسماء تخرج من المجلد

يمكن أن يكون اسم أحد الملفات داخل الأرشيف ../../etc/passwd. وإذا ضمّ أي شيء هذا الاسم إلى مجلد، فسينتهي به الأمر في مكان لم يقصده أحد. هذه مشكلة قديمة، ولها اسم، zip slip، والنصيحة المعتادة هي تنظيف المسار.

أما نحن فنرفضه. هذه الأسماء تصبح عناوين على الأصل نفسه الذي يُقدَّم منه الموقع، والاسم الذي سنضطر إلى تنظيفه اسمٌ لم نفهمه. التنظيف يحوّل مُدخلًا عدائيًا إلى مُدخل يبدو معقولًا. أما الرفض فيحوّله إلى رسالة تقول أي ملف كان المشكلة.

ملفات صغيرة ليست صغيرة

أربعون كيلوبايت يمكن أن تصبح أربعة غيغابايت بعد فك الضغط. والفحص البديهي، أي فك الضغط ثم النظر إلى الحجم، يحدث بعد أن تكون الذاكرة قد نفدت.

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

والأحجام المعلنة هي أيضًا ادعاء من شخص غريب بالطبع. لكنه ادعاء يمكننا التحقق منه بتكلفة زهيدة، ولا يوقعنا في مشكلة إلا إذا صرّح بأقل من الحقيقة. وهذا ما تكشفه القراءة التدريجية للأرشيف أثناء المرور به.

قائمة بما يُسمح به، لا بما يُمنع

الامتدادات التي نقدّمها مدرجة في قائمة. وكل ما عداها يُرفض بالاسم، مع ذكر الامتداد في الرسالة ليعرف الشخص أي ملف يجب أن يزيله.

قائمة الممنوعات ستكون وعدًا بأننا فكّرنا في كل شيء. لم نفعل، ولم يفعل أحد. الاستضافة الثابتة التي تقدّم ملفات .php ليست استضافة ثابتة، والطريقة للتأكد هي تسمية ما يدخل بدلًا مما يبقى خارجًا.

الجزء الذي لم يكن عن الأمان

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

وكان المجلد الذي لا يحتوي على index.html يُعدّ خطأ. وهو ليس كذلك: مجلد صور، أو تقرير مع جدول البيانات الخاص به، شيء معقول تمامًا أن يريد المرء رابطًا له. نكتب نحن الصفحة التي يُفتح عليها: قائمة بما في داخله، مع تهريب كل اسم، لأن هذه الأسماء جاءت من شخص غريب والصفحة تُقدَّم من الأصل نفسه الذي يُقدَّم منه الموقع.

تبدو الاختبارات كقائمة بالأشياء التي لا يُسمح لأرشيف شخص غريب أن يقولها. وكان هذا أنفع شكل وجدناه لها.

أسئلة

ماذا يحدث لملف ZIP فيه اسم يخرج من المجلد؟

يُرفض. لا ينظّف Solta المسار، بل يرفضه برسالة تقول أي ملف كان المشكلة.

كيف يتعامل Solta مع ملف ZIP صغير يصبح غيغابايتات بعد فك الضغط؟

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

ما أنواع الملفات التي تُنشر من ملف ZIP؟

الامتدادات المدرجة في قائمة فقط. وكل ما عداها يُرفض بالاسم، مع ذكر الامتداد في الرسالة لتعرف أي ملف يجب أن تزيله.

لماذا لا يظهر المجلد الخارجي في العنوان؟

من يضغط مجلدًا يجعل كل شيء يصل داخله. المجلد المشترك الواحد في الجذر يُزال. أما إذا كان هناك اثنان أو أكثر، فالأرشيف مرتّب هكذا فعلًا، فيبقى كما هو.

هل يمكن نشر مجلد لا يحتوي على index.html؟

نعم. يكتب Solta الصفحة التي يُفتح عليها: قائمة بما في داخله، مع تهريب كل اسم.

انشر مباشرة من محادثة الذكاء الاصطناعي

اربط Solta بـ Claude أو ChatGPT واطلب ذلك: يُنشر الموقع برابط، دون نسخ أي كود.