دليل عملي

جرد إصدارات PHP لمواقع العملاء: منهج للوكالات

الأمان والمراقبة11 دقيقةً للقراءةعدد الخطوات: 8

عندما يظهر خلل حرج في PHP، يكون سؤال العميل بسيطًا: هل موقعي متأثر؟ أما الوكالة فالإجابة موقعًا بموقع، لدى خمسة مستضيفين وبصلاحيات متفاوتة، تستغرق أيامًا إن لم يكن شيء جاهزًا. يتسع هذا المنهج لنصف يوم لما بين 20 و200 موقع: قياس على مستويات بحسب الوصول المتاح، وسجل يفصل المفترض عن المؤكد، ودفعات أولوية، ورسالة نموذجية، وإثبات مؤرخ للتصحيح. ويُعاد السجل نفسه مع كل ثغرة CVE ومع نهاية عمر كل فرع.

المحتويات· ما الذي يجب أن ينتجه جرد المحفظة1/14
  1. 01ما الذي يجب أن ينتجه جرد المحفظة
  2. 02سياق مؤرخ: PHP2Shell
  3. 03مستويات القياس الأربعة
  4. 04القياس مستوى بعد مستوى
  5. 05لماذا لا phpinfo، وبالأخص ليس علنًا
  6. 06السجل: سطر لكل موقع
  7. 07أعمدة السجل
  8. 08التصنيف في دفعات لا في قائمة مشتريات
  9. 09شبكة الأولويات
  10. 10إبلاغ العملاء دون إفزاعهم
  11. 11رسالتان نموذجيتان
  12. 12إثبات التصحيح ثم إعادة الجرد
  13. 13الإيقاع: جرد كل فصل وعند كل محفّز
  14. 14الوثائق الرسمية

ما الذي يجب أن ينتجه جرد المحفظة

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

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

سياق مؤرخ: PHP2Shell

في 21 أكتوبر 2026 أصدر مشروع PHP الإصدارات 8.5.12 و8.4.27 و8.3.36 و8.2.35 التي تعالج CVE-2026-109618 وCVE-2026-109619 (تنفيذ تعليمات برمجية عن بُعد دون مصادقة). لم يعد PHP 8.1 والفروع الأقدم تتلقى تحديثات من المشروع، ونُشرت تصحيحات مرتجعة دنيا للشيفرة المصدرية للإصدارات 7.4 و8.0 و8.1. أما إدراجها في كتالوج CISA للثغرات المستغلة فيعود إلى 26 أكتوبر 2026، بمهلة اتحادية حتى 29 أكتوبر 2026. نتناول الثغرتين وتحديث خادم واحد في المقال المخصص لذلك؛ وهنا نعالج المحفظة.

مستويات القياس الأربعة

مرّر الجدول أفقيًا

المستوى والوصولما يثبتهما لا يثبته
1. مراقبة خارجية دون وصولترويسة X-Powered-By أو Server، إن وُجدت، توحي بمنظومة وإصدارلا شيء مؤكد: كثيرًا ما تكون الترويسة مخفية أو محذوفة أو خاطئة. إنها افتراض
2. wp-cli أو SSHإصدار ملف PHP التنفيذي لسطر الأوامر، مقروءًا على الجهازالإصدار المقدَّم على الويب: قد يختلف ملف CLI عن PHP-FPM أو Apache
3. لوحة cPanel أو WHM أو Pleskالإصدار المعيَّن لكل نطاق مع معالجهالتصحيح المطبق فعلًا: قد يكون الرقم نفسه مصححًا أو لا بحسب الحزمة
4. Dockerالإصدار في الصورة وفي الحاوية قيد التشغيلأن الصورة المنشورة هي الصحيحة: قارن الصورة بالحاوية الحية
قراءة سجل تغييرات الحزمةأن التصحيح موجود رغم ثبات الرقم (تصحيح مرتجع)أن الموقع لم يتعرض للاختراق قبل التحديث
لا مستوى ممكنلا شيء: ينتقل الموقع إلى الدفعة 4، ويُطلب من العميل أو المستضيفلا تصنّفه أبدًا مصححًا افتراضيًا

القياس مستوى بعد مستوى

  1. المستوى 1: قراءة الترويسات دون وصول

    جهّز الملف sites.txt بعنوان URL في كل سطر، ثم نفّذ while read -r u; do printf '%s,%s\n' "$u" "$(curl -sI --max-time 10 "$u" | tr -d '\r' | grep -iE '^(server|x-powered-by):' | tr '\n' ' ')"; done < sites.txt > externe.csv. يعطي كل سطر العنوان والترويستين المعثور عليهما. السطر الفارغ معلومة: الترويسة مخفية. صنّف هذه المواقع «مفترضة» وانتقل إلى المستوى التالي في أقرب فرصة.

  2. المستوى 2: استعلام WordPress عبر wp-cli

    في موقع WordPress مثبّت عليه wp-cli، يعرض الأمر wp cli info سطرًا باسم PHP binary وسطرًا باسم PHP version ضمن غيرهما. لاستخراج الثاني: wp cli info | grep 'PHP version'. لاحظ أن هذه القيمة تصف الملف التنفيذي المستخدم في سطر الأوامر. وقد يعمل خادم الويب بإصدار آخر، خصوصًا حين يتيح المستضيف عدة إصدارات لكل نطاق. وللتحقق الموثوق قارن بالمستوى 3.

  3. المستوى 2 مكرر: سكربت SSH دفعي

    باستخدام hotes.txt (اسم SSH مستعار في كل سطر): while read -r h; do printf '%s,%s\n' "$h" "$(timeout 20 ssh -n -o BatchMode=yes -o ConnectTimeout=8 "$h" "php -r 'echo PHP_VERSION;'" 2>/dev/null || echo inconnue)"; done < hotes.txt > ssh.csv. الخيار -n يمنع ssh من ابتلاع القائمة، وBatchMode يمنع مضيفًا من طلب كلمة مرور فيعطّل الحلقة، وtimeout يحدّ كل محاولة. تظهر المضيفات الفاشلة باسم "inconnue" بدل أن تختفي: جُرّب السكربت مع مضيف فاشل ومضيف لا يستجيب، وكلاهما ظهر في ملف CSV.

  4. المستوى 3: قراءة اللوحات

    في cPanel، يسرد MultiPHP Manager كل نطاق مع إصدار PHP الخاص به، أو بعلامة Inherited حين يتبع قيمة النظام. وفي WHM تعطي الأداة نفسها العرض بحسب الحساب. وفي Plesk يُضبط الإصدار والمعالج لكل نطاق ضمن المواقع والنطاقات، في قسم إعدادات PHP، بحسب إصدار Plesk. دوّن الإصدار المعروض ثم انتقل إلى الخطوة التالية لمعرفة هل التصحيح موجود.

  5. التصحيحات المرتجعة: اقرأ سجل التغييرات لا الرقم وحده

    كثيرًا ما تصحح التوزيعات والمستضيفون على CloudLinux دون تغيير الرقم الأصلي. تقول AlmaLinux ذلك صراحة في إشعارها: لا تعتمد على php -v، بل قارن الحزمة المثبتة بالإصدار المصحح المنشور، مثلًا عبر rpm -q php-common. وللبحث عن ثغرة CVE في تاريخ الحزمة: rpm -q --changelog php-common | grep CVE-2026-109618 في عائلة RHEL، وapt changelog متبوعًا باسم الحزمة في Debian وUbuntu. إن غابت الثغرة عن التاريخ فهي غير مصححة في تلك الحزمة.

  6. المستوى 4: الحاويات

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

لماذا لا phpinfo، وبالأخص ليس علنًا

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

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

السجل: سطر لكل موقع

يكفي جدول بيانات مشترك، شرط أن يلتزم الجميع بالأعمدة نفسها. الهدف أن يستأنف زميل الجرد دون أن يسألك، وأن يتسلم العميل سطره كما هو.

أعمدة السجل

  • الموقع والعميل والمستضيف — هوية السطر مع العنوان الأساسي وجهة الاتصال التقنية.
  • نوع الوصول — لا شيء، أو wp-cli، أو SSH، أو لوحة، أو Docker: ما يحدد المستوى الممكن بلوغه.
  • طريقة القياس — الأمر أو الشاشة المستخدمة، ليمكن إعادة القياس بالطريقة نفسها.
  • الإصدار المقروء وSAPI — الرقم ونمط التنفيذ (FPM أو وحدة Apache أو CLI)، فالخطر يختلف بحسب النمط.
  • تاريخ القياس — إصدار بلا تاريخ مجرد رأي.
  • مستوى الثقة — مفترض (المستوى 1) أو مؤكد (المستويات 2 إلى 4)، مع إشارة التصحيح المرتجع إذا أكدها سجل التغييرات.
  • دفعة الأولوية والحالة — من 1 إلى 4، ثم للإنجاز، أو تم الإبلاغ، أو قيد التنفيذ، أو مصحح، أو مرفوض من العميل.
  • تاريخ التصحيح وإثباته — اللقطة ومخرجات الأمر واسم المنفِّذ.

التصنيف في دفعات لا في قائمة مشتريات

عندما يمتلئ السجل، لا يعود السؤال «هل كل شيء محدَّث؟» بل «من أين نبدأ؟». تجيب أربع دفعات. الدفعة 1 تجمع المواقع المكشوفة على فرع لم يعد يتلقى تصحيحات من مشروع PHP (8.1 وما قبله)، إلا إذا أكد سجل التغييرات تصحيحًا من المورّد. الدفعة 2: فرع ما زال مدعومًا لكن بإصدار أقدم من التصحيح. الدفعة 3: فرع مصحح يلزم تأكيده بقياس من المستوى 2 أو 3. الدفعة 4: موقع لا يمكن بلوغه أو إصدار مجهول.

ثلاثة معايير ترفع الموقع دفعة: نموذج عام، أو متجر، أو بيانات شخصية، أو إضافة تقبل ملفات مرفوعة. موقع عرض ثابت في الدفعة 2 يأتي بعد متجر في الدفعة 3.

شبكة الأولويات

مرّر الجدول أفقيًا

الدفعةالمعيارالإجراء
الدفعة 1مكشوف، فرع بلا تصحيح من المشروع (8.1 وما قبله)الترحيل أو طلب حزمة مصححة من المورّد، وإبلاغ العميل في اليوم نفسه
الدفعة 2فرع مدعوم، إصدار أقدم من التصحيحالتحديث إلى الإصدار المصحح للفرع خلال الأسبوع
الدفعة 3فرع مصحح، قياس يلزم تأكيدهقياس من المستوى 2 أو 3 ثم رفع الثقة إلى مؤكد
الدفعة 4لا يمكن بلوغه أو وصول مرفوض أو إصدار مجهولطلب الوصول أو الإصدار من العميل، والمتابعة وتأريخ كل طلب
عامل مشددنموذج، متجر، بيانات شخصية، رفع ملفاتيرفع الموقع دفعة واحدة في ترتيب المعالجة

إبلاغ العملاء دون إفزاعهم

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

رسالتان نموذجيتان

  1. عميل مطّلع على حالة موقعه

    «مرحبًا، قرأنا إصدار PHP لموقعكم بتاريخ [التاريخ]. كان [الإصدار]، أقدم من التصحيح الذي نشره مشروع PHP لخللين حرجين. سنحدّثه بتاريخ [التاريخ] دون انقطاع متوقع. ثم نرسل لكم إثباتًا مؤرخًا للإصدار العامل. لا يلزمكم أي إجراء. إن كانت لديكم أسئلة فأجيبوا على هذه الرسالة.»

  2. عميل لا يمكن ترحيل موقعه فورًا

    «مرحبًا، يعمل موقعكم بإصدار PHP لم يعد يتلقى تصحيحات من المشروع. يتطلب الترحيل [الأعمال]، ونقترحه بتاريخ [التاريخ]. وفي الأثناء نطبّق [الإجراء: حزمة مصححة من المستضيف، أو إزالة نموذج رفع الملفات، أو التصفية]. تخفف هذه الإجراءات الخطر دون أن تزيله. نرجو تأكيد التاريخ المعتمد قبل [التاريخ].»

إثبات التصحيح ثم إعادة الجرد

إثبات التصحيح سجل لكل موقع: القياس قبل التدخل، والتدخل، والقياس نفسه بعده، واللقطة أو مخرجات الأمر، ورقم الإصدار، والتاريخ، واسم المنفِّذ. إعادة القياس نفسه بالطريقة نفسها هي ما يجعل الإثبات قابلًا للمقارنة. احتفظ بالسجل الزمني مع السجل.

تذكّر الحدّ: الإصدار المقروء يثبت الإصدار المقدَّم لحظة القياس، لا غياب اختراق سبق التحديث. وإذا بقي موقع مكشوفًا بعد 21 أكتوبر 2026 فالبحث عن آثار الاستغلال عمل ثانٍ يصفه مقال PHP2Shell.

الإيقاع: جرد كل فصل وعند كل محفّز

أعد الجرد كل فصل، وعند كل ثغرة CVE حرجة جديدة وعند نهاية عمر كل فرع. قارن القياسين: الانحراف هو موقع انخفض إصداره أو عاد مستوى ثقته إلى مفترض. دوّن في السجل تواريخ نهاية العمر المهمة. بالنسبة إلى PHP 8.2 يحدد المشروع 31 ديسمبر 2026؛ وقائمة الترحيل إلى 8.3 أو 8.4 في المقال المخصص. الدفعة الأولى من الجرد التالي معروفة سلفًا: كل ما بقي على 8.2 في الأول من يناير.

الوثائق الرسمية

  • إشعار PHP بتاريخ 21 أكتوبر 2026 — https://www.php.net/archive/2026.php#2026-10-21-5
  • إصدارات PHP المدعومة — https://www.php.net/supported-versions.php
  • تنبيه CISA بتاريخ 26 أكتوبر 2026 — https://www.cisa.gov/news-events/alerts/2026/10/26/cisa-adds-two-known-exploited-vulnerabilities-catalog
  • مستودع php2shell لدى NCSC-NL — https://github.com/NCSC-NL/php2shell
  • إشعار AlmaLinux عن الحزم المصححة — https://almalinux.org/blog/2026-10-21-php2shell-cve-2026-109618-cve-2026-109619/
  • MultiPHP Manager (cPanel) — https://docs.cpanel.net/cpanel/software/multiphp-manager-for-cpanel/
  • wp cli info — https://developer.wordpress.org/cli/commands/cli/info/

مكان واحد لقراءة إصدار PHP لكل حساب وفرضه

عندما تتوزع مواقع العملاء على عدة مستضيفين، تبدأ كل عملية جرد من الصفر: صلاحيات يجب جمعها، وإصدارات متباينة، وتجديدات متفرقة. استضافة الموزّع Agency S (WHM، علامة بيضاء) أو أسطول من خوادم VPS يجمع الحسابات في مكان واحد: واجهة واحدة لقراءة إصدار PHP لكل حساب وفرضه والاحتفاظ بإثباته. تتضمن عروض Agency نسخًا احتياطية يومية.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة