النسخة الاحتياطية في جذر الموقع تسريب للكود المصدري
قبل تعديل ملف كبير، من الطبيعي نسخه أولًا. cp index.php index.php.vor-aenderung، ثم العمل. فإذا كان ذلك الملف في المجلد الذي ينشره خادم الويب، يصبح الكود المصدري بأكمله قابلًا للتنزيل نصًا عاديًا — بيانات الدخول إلى قاعدة البيانات، والأسرار، وكل ما يصادف أن يحتويه الملف.
يشغّل Apache الملف index.php عبر PHP لأن اسمه ينتهي بالامتداد .php. أما index.php.vor-aenderung فلا ينتهي بالامتداد .php. بل ينتهي بالامتداد .vor-aenderung، الذي لم يسمع به Apache قط، فيفعل الشيء الافتراضي ويرسل البايتات كما هي.
القاعدة التي يكتبها معظم الناس، ولماذا لا تكفي
الحماية المعتادة قائمة حظر للامتدادات: .bak، .orig، .save، .sql، .old. وهي تلتقط الملف الذي خطر على البال. وعند اختبارها هنا، أعطت تلك القائمة الإجابة الصحيحة للملف probe.bak والإجابة الخاطئة لكل واحد من هذه الملفات:
index.php.vor-xyz— وهكذا حدث الأمر فعلًاindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
كلها قُدِّمت بالرمز 200. نمط التسمية الذي لم يفكر فيه أحد هو الذي يُستخدم، لأن النسخ الاحتياطية تُسمّى بحسب ما كان يجري في ذلك الوقت.
اقلب المعيار
القاعدة الناجحة لا تسأل عن الامتدادات المحظورة. بل تطرح سؤالًا بنيويًا: هل يحتوي اسم هذا الملف على امتداد كود مصدري ليس في نهايته؟
إذا كان كذلك، فهو نسخة من شيء كان يُفترض أن يُنفَّذ، أيًا كانت اللاحقة التي تليه. index.php.anything يطابق. style.css.anything يطابق. فالنمط يغطي الأسماء التي لم يخترعها أحد بعد، وهذا هو الهدف كله.
عند التحقق اليوم على الخادم الفعلي، أصبحت الأسماء الخمسة أعلاه كلها تُعيد 403، بما فيها الأسماء غير الموجودة — فالقاعدة تحظر الشكل، لا الملف.
الاستثناء، وما يعلّمنا إياه
هناك اسم ملف مشروع واحد هنا له هذا الشكل بالضبط: فالملفات المضغوطة مسبقًا تُكتب بالصيغة style.css.1787777226.gz، أي بامتداد في الوسط عن قصد. لذا تتضمن القاعدة استثناءً واحدًا ضيقًا لمقطع رقمي يليه .gz، وهذا الملف يُعيد 200 كما ينبغي.
مثل هذا الاستثناء هو عادةً الموضع الذي تخطئ فيه هذه القواعد، لذا من المفيد توضيح ما يجعل هذا الاستثناء آمنًا: إنه ضيق بما يكفي بحيث لا يمكن بناء أي index.php.something.gz لجلب الكود المصدري، لأن المقطع الأوسط يجب أن يتكون من أرقام فقط. أما استثناء أوسع — «أي شيء ينتهي بـ .gz» — فكان سيُبطل القاعدة بأكملها.
وتبقى النصيحة الأبسط هي التي تجعل كل هذا غير ضروري: احتفظ بالنسخ الاحتياطية خارج المجلد المنشور. فالقاعدة شبكة أمان لليوم الذي يُنسى فيه ذلك، لا رخصة للكفّ عن الاهتمام بالمكان الذي تستقر فيه النسخة.