CompertMe

دراسة حالة 01 · منصة التعرّض السيبراني · من 2021 إلى اليوم

خمس سنوات نحوّل فيها خبرة شركة استشارات أمنية إلى منتج يعمل تلقائيًا

عشر خدمات أمنية ودرجة مخاطر واحدة تساعد المدير على اتخاذ القرار.

بقلم Hesham Ghoniem، المهندس الرئيسي · ·

القطاع
برمجيات للأمن السيبراني تُباع عبر الإنترنت مباشرةً وبالعلامات التجارية للشركاء
طبيعة التعاون
مستمر منذ 2021 · التصميم والبناء والتشغيل والصيانة
نطاق العمل
المنصة بأكملها · ندير 3 خوادم إنتاج
التقنيات المستخدمة
Laravel
Vue 3
Inertia
Tailwind
MySQL
PostgreSQL
Redis
AWS
  • 10 — خدمات أمنية، تجمع خمس منها نتائجها في درجة واحدة
  • 10 — خدمات خارجية مستخدمة، نتحقق من سلامة عمل كل منها
  • 88 — مهمة مجدولة، أسرعها تعمل كل 30 ثانية
  • 5 سنوات — نسخة أعدنا بناءها تعمل فعليًا، وأخرى في مرحلتها الأخيرة
  • ~260,000 — سطر من الكود في التطبيق الموحّد

نظرة عامة

أرادت الشركة بيع منتج بدلًا من التقارير. فبنيناه لها.

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

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

في 2025 بنينا داخل المنصة منتجًا ثانيًا يُباع عبر الإنترنت بعلامة تجارية خاصة، ويستخدمه العميل بنفسه. يوفّر المنتج فترة تجريبية مجانية ودفعًا بالبطاقة ولوحة تحكم خاصة، تختصر النتائج كلها في درجة مخاطر واحدة، مع إمكانية الاطّلاع على أدلتها بنقرة واحدة.

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

التحديات

تسع مشكلات لا يكفي بذل مزيد من الجهد لحلّ أيّ منها.

خبرة لا يمكن توسيع نطاقها بالأسلوب نفسه

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

مصادر متعددة وإجابة واحدة

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

لا مجال لتعليق العمل

لم يكن بوسع الشركة تعليق المبيعات 3 أشهر حتى يلحق التطوير باحتياجاتها. كان علينا تغيير البنية البرمجية في منتج يعمل فعليًا، جزءًا جزءًا، مع بقاء كل رابط محفوظ صالحًا في صباح اليوم التالي.

البنية البرمجية نفسها أصبحت خطرًا أمنيًا

بحلول 2026، كانت المنصة تعمل بتطبيقين يشتركان في قاعدة بيانات واحدة: واجهة مبنية يدويًا بلغة PHP، ومحرك خلفها مبني بإطار Laravel. وكان عرض صفحة واحدة يتطلّب دورتين من الطلب والاستجابة عبر نسختين من الكود. واعتمدت الواجهة على Bootstrap 4، الذي انتهى دعمه في يناير 2023، وفيه ثغرات معلنة لن تتلقى إصلاحات أبدًا. كما اعتمدت على jQuery، وهي مكتبة قديمة للمتصفح ولها سجل من الثغرات المعلنة أيضًا.

المكتبات القديمة في الواجهة تمسّ مصداقية شركة تبيع خدمات الفحص الأمني. يستطيع أي شخص تنزيل كود الواجهة؛ فلا يوجد جدار حماية يحجب الكود عن المتصفح. وكان بإمكان أي باحث يفحص الموقع اكتشاف المكتبات القديمة خلال ثوانٍ، ولم تكن الشركة تستطيع تقديم إجابة صادقة بشأنها في استبيانات مشتريات الشركات الكبرى.

منتج لا يدعم سوى الإنجليزية، وبنيته تعوق إضافة أي لغة

تعثّرت كل محاولة لإضافة لغة ثانية بسبب بنية الكود. فقد تظهر الجملة نفسها في 3 مواضع: صفحة PHP مباشرة، وملف jQuery يُنشئ النص في المتصفح، وجزء من قالب Blade يعيده محرك Laravel عبر Ajax. لم تكن هناك طبقة واحدة يمكن تطبيق الترجمة فيها. وكانت إضافة لغة واحدة تتطلّب بناء 3 أنظمة ترجمة منفصلة ومزامنتها. وفي كل مرة، لم تكن الفائدة تبرّر التكلفة المقدّرة، فظلّت الميزة مؤجّلة.

وزادت اللغات التي تُكتب من اليمين إلى اليسار الأمر تعقيدًا. فالعربية والعبرية تتطلّبان عكس اتجاه التخطيط بأكمله، إلى جانب تغيير الكلمات. وكانت الواجهة تعتمد على شبكة تخطيط تراكمت فوقها خلال 5 سنوات قواعد CSS مكتوبة يدويًا ومصمّمة للإنجليزية أولًا.

من عملاء مباشرين إلى عملاء لشركات أخرى

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

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

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

منتج ثانٍ داخل المنتج الأول

في 2025، قررت الشركة البيع بطريقة جديدة: مباشرةً للشركات عبر الإنترنت، تحت علامة تجارية خاصة بها. يسجّل الزائر في موقع المنتج، ويحصل على فترة تجريبية مجانية مدتها 30 يومًا، ثم يدفع بالبطاقة عند انتهائها. دون مندوب مبيعات أو شريك أو مكالمة لإعداد الحساب.

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

صفحة دفع واحدة تميّز بين خمس حالات للعميل

كان هذا أصعب تحدٍّ تجاري في المنصة، وأقلّ تحدياتها ظهورًا لمن ينظر إليها من الخارج. ففي منتج الخدمة الذاتية، قد يفتح العميل صفحة إدارة الاشتراك في أيّ من 5 حالات:

  • يستخدم الفترة التجريبية المجانية ويختار باقة مدفوعة لأول مرة
  • يدفع شهريًا ويريد زيادة السعة المتاحة له
  • يدفع سنويًا
  • يعود بعد انتهاء الفترة التجريبية
  • يعيد تفعيل حسابه بعد انتهاء باقة مدفوعة

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

رسالة سليمة في برنامج بريد ومشوّهة في آخر

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

لا يوجد معيار موحّد للبريد الإلكتروني كما هي الحال في صفحات الويب. يستخدم Outlook على Windows محرك Microsoft Word لعرض الرسائل، وهو يتجاهل كثيرًا من أساليب التخطيط الحديثة. فقد تبدو رسالة مكتملة على الهاتف، ثم تصل إلى Outlook لدى مدير بتخطيط مختلّ وزر مفقود وصور ممدّدة. وعملاء هذا المنتج يستخدمون Outlook لقراءة بريدهم. ويجب أيضًا أن تظهر كل رسالة بصورة سليمة على الهاتف والجهاز اللوحي والحاسوب، وأن تبقى مقروءة في الوضع الداكن، وتحمل شعار الشريك المعني بدلًا من شعارنا.

مطلع 2024 · أزمة المزوّد

الأسبوع الذي توقفت فيه البيانات

اعتمدت خدمة الويب المظلم على 4 مزوّدين متعاقبين، ولم ننتقل باختيارنا إلا مرة واحدة.

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

ثم أبلغنا ذلك المزوّد، في مطلع 2024، بأنه سيوقف خدمته في نهاية الشهر.

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

بحثنا عن حلّ بهدوء، فوجدناه في بياناتنا.

كانت قاعدة بياناتنا تحتفظ بكل عنوان بريد كشف المزوّد المغادر عن تسريبه. اقترحنا على المدير التقني لدى الشركة إعادة الاستعلام عن تلك العناوين لدى خدمة البحث عن الاختراقات التي بدأنا بها. بذلك نستمر في الإجابة عن السؤال الوحيد الذي يهم العملاء: هل تسرّبت أيّ من بياناتنا؟

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

أربعة مزوّدين وانتقالان اضطراريان

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

ثم بنينا التكامل الكامل مع البديل.

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

ثم تكرّر الموقف لسبب مختلف.

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

ثلاث نتائج خرجنا بها

  • استمر الحل المؤقت بعد انتهاء الأزمة. عمل إلى جانب المزوّد الجديد 5 أشهر إضافية بوصفه وسيلة تحقق ثانية مستقلة، ولم نوقفه إلا بعد أن أثبت التكامل الجديد موثوقيته.
  • استقرّت بنية قاعدة البيانات. عند التغيير الثالث، أصبحت قاعدة البيانات هي الجزء الثابت الذي يتكيّف معه المزوّدون. ويمكننا الآن استبدال المزوّد دون تغيير ما يراه العملاء.
  • لم يلحظ العملاء أي تغيير. تعاقب 4 مزوّدين واضطررنا إلى الانتقال مرتين، وظلّت الوحدة تعمل خلال كل انتقال.

لم يفقد أي عميل الخدمة التي يدفع مقابلها، في أي يوم، خلال أي مرحلة من مراحل الانتقال.

— Hesham Ghoniem، المهندس الرئيسي

ما بنيناه

خمس سنوات، ونسخة أعدنا بناءها تعمل فعليًا وأخرى في مرحلتها الأخيرة، وبيانات بقيت في مكانها.

الفصل الأول · 2021 · بناء الأساس يدويًا

المنتج يتشكّل

بدأنا بموقع واحد لتدريب الموظفين، ومكتب دعم، وصفحات مساعدة، وإدارة المستخدمين. وخلال العامين التاليين، أضفنا نحو خدمة جديدة كل 3 أشهر: فحص الثغرات، ومحاكاة التصيّد، والفوترة، والتنبيهات الفورية، وMicrosoft 365، ومراقبة كلمات المرور المسرّبة. وبحلول ذلك الوقت، أصبح الموقع يدير أعمال الشركة.

الفصل الثاني · 2023 · ميزة تلو الأخرى

محرك جديد داخل النظام القائم

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

ثم تغيّر نموذج العمل.

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

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

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

2025 · منتج داخل المنتج

منتج ثانٍ داخل المنتج الأول

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

خصائص للمنتج الجديد لا تتاح للعملاء الآخرين

  • لوحة تحكم جديدة تتمحور حول درجة المخاطر. تقيّم كل خدمة، من أصل 5 خدمات كحد أقصى، ما تكتشفه. وتجتمع هذه التقييمات في درجة إجمالية واحدة، مع سهم يقارنها بالدرجة السابقة وقائمة بأهم 5 أمور ينبغي إصلاحها.
  • وحدة لأمن سلسلة التوريد. يدعو العملاء مورّديهم إلى الإجابة عن استبيان أمني ومشاركة شهاداتهم.
  • تقرير شهري جاهز للعرض على مجلس الإدارة. يرسم الخادم مؤشرات القياس، فيطابق ملف PDF ما يظهر على الشاشة.
  • 29 رسالة بريد خاصة بالمنتج، منها سلسلة رسائل للفترة التجريبية الممتدة 30 يومًا، محدّدة الإرسال بحسب اليوم.

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

لا يزال المنتجان يستخدمان نسخة واحدة من الكود. ويتحقق نحو ربع قواعد الصلاحيات في المنصة الآن من المنتج الذي يتبع له العميل، وتعمل أكثر من 12 مهمة مجدولة للمنتج الجديد وحده. أما عملاء المنصة الأصلية، فواصلوا استخدامها كما كانت تمامًا.

الفصل الثالث · 2026 · لم ننتقل إليه بعد · في مرحلته الأخيرة

دمج التطبيقين في تطبيق واحد

بحلول 2026، أصبح تشغيل المنصة بتطبيقين هو الخطر الأمني الوارد في التحدّي الرابع. وقبل كتابة أي كود، قدّمنا للشركة مقترحًا مكتوبًا يحدّد التكلفة والمبرّرات التجارية والمخاطر والأسئلة المفتوحة، ثم خطة تنفيذ على مراحل تمتد 12 أسبوعًا. والنتيجة تطبيق حديث واحد: 121 شاشة أعدنا بناءها باستخدام Vue بالاعتماد على 480 مكوّنًا مشتركًا، مع تسجيل دخول واحد ونظام تصميم واحد. أما الحل الأمني الالتفافي الذي فرضه فصل التطبيقين، فحذفناه بدلًا من مواصلة صيانته.

حلّ الدمج مشكلة اللغات أيضًا. بوجود موضع واحد لكتابة النصوص بدلًا من 3، أصبحت الترجمة جزءًا من المنصة لا مشروعًا منفصلًا. جميع النصوص الظاهرة، وعددها 5,351، موجودة الآن في مجموعة ملفات واحدة تخدم الخادم والمتصفح معًا، وينعكس اتجاه التخطيط تلقائيًا للغات التي تُكتب من اليمين إلى اليسار. أصبحت إضافة لغة تتطلّب خطوتين ولا تتطلّب أي تغيير في الكود. أعددنا العربية والعبرية والفرنسية والإسبانية وهي تنتظر الترجمة، أما النسخة المتاحة اليوم فهي الإنجليزية.

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

والذكاء الاصطناعي أيضًا

صمّمناه ليكون جديرًا بالثقة

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

يستند إلى بيانات فعلية

لا يتناول إلا نتائج موجودة لدى العميل

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

استهلاك محسوب

لا تتراكم تكلفته دون أن تُرصد

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

يمكن تغيير مزوّده

إعداد واحد لتغيير المزوّد

في 2026، انتقلت المنصة من مزوّد ذكاء اصطناعي إلى آخر بتغيير قيمة واحدة. ويظل المزوّد السابق متاحًا للاختيار إذا احتجنا إلى العودة إليه.

قيد المراجعة

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

في جميع المراحل

بقيت البيانات في مكانها

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

تفاصيل تقنية · محرك الفحص

تفاصيل أصعب تكامل

تعتمد خدمة اكتشاف سطح الهجوم على محرك استطلاع مفتوح المصدر مستضاف ذاتيًا. وهو ليس واجهة API تجارية لها عقد وخط دعم، بل تطبيق منفصل على خادم خاص به، وقاعدة بيانات PostgreSQL تضم نحو 100 جدول، وله طريقته الخاصة في تنظيم بيانات الفحص. ولم يُصمّم أصلًا لتزويد منتج آخر بالبيانات.

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

تشغيل المحرك

كان علينا أولًا تشغيله.

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

ضبط الحمل على الخادم

ثم استنزف موارد الخادم.

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

ضبط كل نمط فحص

ثم ضبطنا إعدادات كل نمط فحص يدويًا.

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

فهم المحرك

ثم درسناه بالكامل.

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

التكامل الأول

نجح التكامل الأول، لكن تكلفته كانت مرتفعة.

جمع التكامل الأول البيانات وفق جدول زمني: 23 أمرًا مجدولًا، منها 14 تمرّ كل ساعة على جداول المحرك، بمعدل 100 صف في كل دفعة، للعثور على الصفوف القليلة التي تغيّرت. وصلت البيانات، لكن تراكمت معها مهام في الخلفية بالكاد استطاع الخادم تحمّلها.

التكامل الثاني

التكامل الثاني يتلقى التغييرات بدلًا من طلبها.

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

نسخة مستقلة من البيانات

في التكاملين، رفضنا القراءة المباشرة من المحرك.

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

بنينا بدلًا من ذلك نسخة كاملة ومستقلة من كل سجل داخل قاعدة بياناتنا، تشمل البنية كاملةً وفق نموذجنا، وليست ذاكرة تخزين مؤقت أو ملخّصًا. شملت 39 نوعًا من السجلات عبر 78 تغييرًا في قاعدة البيانات، تغطّي النطاقات الفرعية ونقاط النهاية والمنافذ وعناوين IP والتقنيات والمجلدات وجدران حماية تطبيقات الويب، والثغرات وما يرتبط بكل منها من تفاصيل CVE وCWE ومراجع ووسوم. ولا يقرأ المنتج إلا من جداوله الخاصة.

الواجهة

ثم أعدنا بناء الواجهة: تطبيق داخل تطبيقنا.

يحصل العملاء على كامل التفاصيل التي ينتجها المحرك ضمن منتجنا، بدلًا من رابط إلى أداة أخرى: 11 شاشة و58 مكوّنًا.

  • النطاقات الفرعية
  • نقاط النهاية التي تعمل فعليًا
  • المنافذ المفتوحة
  • التقنيات
  • المجلدات
  • DNS وتسجيل النطاقات
  • لقطات شاشة لكل مضيف
  • سلامة الشهادات
  • خريطة سطح الهجوم
  • التغييرات منذ آخر فحص
نسخة البيانات: كل الأسهم في اتجاه واحد

تزوّد قاعدة بيانات PostgreSQL الخاصة بمحرك الفحص قاعدة بيانات المنصة عبر 13 عملية استماع فورية و24 أمرًا مجدولًا، ولا يقرأ متصفح العميل إلا من المنصة. لا يوجد سهم عكسي، ولا اتصال بين المتصفح والمحرك.

لو اختفى محرك الفحص غدًا، لظلّ كل عميل قادرًا على رؤية جميع النتائج التي أنتجها له.

إبقاء هذه النسخة محدّثة هو جوهر العمل الهندسي

تعمل آليتان بالتوازي:

  • 13 مشغّلات فورية — تتلقّى 13 عملية استماع مستمرة، يحافظ برنامج إشراف على تشغيلها، كل سجل، وتحدّد الجدول المناسب له في قاعدة بياناتنا، وتربطه بالفحص والنطاق المعنيين، ثم تكتبه مع إزالة التكرارات. وإذا انقطع اتصال إحدى عمليات الاستماع، تعيد الاتصال تلقائيًا. وإذا تعذّر عليها تحليل سجل، تكتب عنه في سجل الأحداث بدلًا من إيقاف العملية.
  • 24 مطابقة مجدولة للبيانات — تلتقط المشغّلات السجلات الجديدة، وتتولّى المهام المجدولة ما عداها: التحديثات، واستكمال البيانات السابقة، وما فات أثناء إعادة تشغيل إحدى عمليات الاستماع. ينفّذ هذا العمل 24 أمرًا مجدولًا، ويعمل أسرعها كل 30 ثانية.

بعض بيانات الفحص لا يحتاج إلى مزوّد.

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

يعمل التكامل في اتجاه واحد فقط. ترسل قاعدة بياناتهم البيانات إلى قاعدتنا، ولا يعتمد عمل قاعدتنا على استمرار عمل قاعدتهم.

— Hesham Ghoniem، المهندس الرئيسي

طلب مقتضب · تحليل الشهادات

طلب من كلمتين، ومنتج متكامل

نص الطلب كاملًا

«تحليل SSL».

لم تكن هناك مواصفات أو قائمة فحوص أو شاشات. استفدنا من حرية التصرّف التي أتاحها الطلب لنحدّد ما ينبغي أن تقدّمه الخدمة.

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

ثم أتحنا تحليل جميع النطاقات دفعة واحدة.

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

ثم جعلنا النتائج مفيدة لغير المتخصصين.

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

اقتصر طلب الشركة على كلمتين، وحصلت على خدمة متكاملة فاجأتها.

— Hesham Ghoniem، المهندس الرئيسي

كيف نعمل

تسع قواعد، تعلّمنا معظمها من تجارب صعبة.

نستبدل النظام وهو يعمل

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

نقدّم التغييرات الكبيرة للشركة مكتوبةً أولًا

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

نضع قواعد العمل في الإعدادات

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

نفصل الكود عن المزوّد بطبقة وسيطة

حين يكون استبدال المزوّد واردًا، يتعامل الكود مع طبقة وسيطة بدلًا من المزوّد مباشرةً. تعلّمنا ذلك في 2024، عندما أوقف مزوّد خدمته بعد إشعار بمهلة شهر. ومنذ ذلك الحين، استبدلنا 3 مزوّدين للبيانات دون تعطيل الميزات التي تعتمد عليهم.

نفترض أن المزوّد سيختفي

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

نصمّم البريد ليتوافق مع Outlook أولًا

نبني كل رسالة من مكتبة مكوّنات مشتركة واحدة، مع نسخة خاصة لكل مكوّن تناسب Outlook عند الحاجة. نستخدم صور PNG بأبعاد ثابتة في كود الرسالة، وتظل الأزرار ظاهرة عند تعطيل الصور. ونرسل رسالة لكل سيناريو إلى صندوق بريد اختباري لنقيّم التخطيط داخل Outlook نفسه، لا في معاينة المتصفح.

لا نقرأ مباشرةً من نظام لا نتحكم فيه

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

ذكاء اصطناعي يصرّح بأنه لا يملك إجابة

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

ونتولّى التشغيل أيضًا

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

التقنيات المستخدمة

تسع طبقات، ودور كل منها.

التطبيق

أساس المنصة. Laravel إطار ناضج يسرّع التطوير، ويسهل العثور على مطوّرين للعمل به.

  • PHP 8.4
  • Laravel 12

الواجهة

تتحدّث الصفحات دون إعادة تحميلها بالكامل، وتحظى جميع المكتبات التي تعتمد عليها بدعم أمني مستمر.

  • Vue 3
  • Inertia
  • Tailwind 4
  • Vite

اللغات

تخدم مجموعة واحدة من ملفات الترجمة الخادم والمتصفح، وينعكس اتجاه الصفحة تلقائيًا للغات التي تُكتب من اليمين إلى اليسار.

  • ترجمات Laravel
  • laravel-vue-i18n
  • سجل اللغات

الذكاء الاصطناعي

شروح مبسّطة بالإنجليزية لنتائج الفحوص الأمنية. يتطلّب تغيير المزوّد تعديل إعداد واحد، والإنفاق محدود ومسجّل، ولا نخزّن نصوص الطلبات أو الإجابات مطلقًا.

  • نموذج لغوي كبير
  • مزوّد بديل
  • تخزين مؤقت للإجابات
  • حصص استخدام لكل شركة

البيانات

قاعدة بيانات رئيسية واحدة، وأخرى تخص محرك الفحص وتنسخ المنصة بياناتها سجلًا بسجل. ويدير Redis طوابير المهام والتخزين المؤقت.

  • MySQL
  • PostgreSQL
  • Redis

المهام في الخلفية

لا ينتظر المستخدم انتهاء العمليات الثقيلة. فالفحوص والمزامنة والتقارير تعمل وفق جداولها الخاصة.

  • Laravel Horizon
  • 88 مهمة مجدولة

المستندات

تقارير PDF جاهزة للعرض على مجلس الإدارة، وجداول بيانات للمختصين، وحزم من الأدلة.

  • mPDF
  • TCPDF
  • Headless Chrome
  • Excel
  • CSV
  • ZIP

الخدمات السحابية

تخزين الملفات، وإرسال البريد مع تتبّع الرسائل المرتدّة، وتحديثات فورية في المتصفح.

  • AWS S3
  • رسائل البريد الإلكتروني التلقائية
  • المراسلة الفورية

أدوات الأمان

نتناولها بالتفصيل في قسم الأمان أدناه.

  • المصادقة الثنائية باستخدام TOTP
  • روابط دخول دون كلمة مرور
  • تنقية HTML
  • سياسة أمان المحتوى
  • 117 قاعدة صلاحيات

الاختبارات الآلية

تتحقق الاختبارات الآلية من كل تغيير قبل وصوله إلى بيئة الإنتاج.

التكاملات بحسب وظيفتها

  • محرك استطلاع مستضاف ذاتيًا
  • أداة تجارية لفحص الثغرات
  • مزوّد معلومات الويب المظلم
  • خدمة عامة للبحث عن الاختراقات
  • منصة للتوعية الأمنية ومحاكاة التصيّد
  • Microsoft 365
  • Slack وMicrosoft Teams
  • منصة لفوترة الاشتراكات
  • خدمة لرسائل البريد الإلكتروني التلقائية
  • مزوّد الذكاء الاصطناعي ومزوّد بديل
  • AWS S3
  • استعلامات WHOIS وDNS وفحص المنافذ بأدوات نديرها داخليًا

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

كيف تعمل المنصة

ست خطوات من اسم نطاق إلى تقرير جاهز لمجلس الإدارة.

الخطوة 1

الربط

تسجّل الشركة وتضيف نطاقاتها. ويمكنها ربط Microsoft 365 لإبقاء قائمة الموظفين محدّثة.

الخطوة 2

الاكتشاف

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

الخطوة 3

المراقبة المستمرة

تفحص المنصة الشهادات، وتعيد فحص الثغرات، وتبحث عن بيانات الدخول المسرّبة، وتجلب نتائج التدريب والتصيّد. تعمل أسرع الفحوص كل 30 ثانية، وتصدر تنبيهات الاختراقات الجديدة خلال 5 دقائق، وتعيد المنصة حساب درجة المخاطر كاملةً كل 6 ساعات أو عند الطلب.

الخطوة 4

التقييم

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

الخطوة 5

الشرح

يكتب نموذج لغوي كبير شرحًا مبسّطًا بالإنجليزية لكل ثغرة تكتشفها فحوص المواقع، خلال 10 دقائق من اكتشافها. يستند الشرح إلى نتائج موجودة لدى العميل، ويخضع الاستخدام لحدود تمنع تراكم التكلفة، وتُخزّن الإجابات مؤقتًا لتصل الشروح الشائعة فورًا. ويمكن نشر النتائج مباشرةً في قناة العميل على Slack أو Microsoft Teams.

الخطوة 6

التقارير

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

الخطوة 4 بالتفصيل: خمس خدمات ودرجة واحدة

تغذّي 5 خدمات، هي كلمات المرور المسرّبة والثغرات واكتشاف المواقع والتصيّد والتدريب، درجة مخاطر إجمالية واحدة مع سهم يوضّح اتجاه التغيّر، وتظهر الدرجة في لوحة التحكم والتقرير الشهري.

الجانب التجاري: «الاشتراكات» و«إدارة الاشتراك»

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

منصة الفوترة هي المرجع الأساسي للبيانات المالية، ومنصتنا هي المرجع الأساسي للبيانات المتعلقة بما يحقّ للعميل استخدامه. وتُبقي آلية مطابقة موحّدة السجلين متوافقين دائمًا. تُطبّق حدود الباقات على النطاقات وأهداف الفحص كل ساعة، وندعم بالكامل الاشتراكات التي تُسدّد بتحويل بنكي أو تُحصّل بموجب فاتورة. وتعمل دورة الاشتراك تلقائيًا: سلسلة من 16 رسالة خلال الفترة التجريبية الممتدة 30 يومًا، ورسائل التجديد وتعذّر الدفع، ومستوى مجاني يحتفظ بالحساب وسجلّه عند انتهاء الاشتراك، وإعادة التفعيل، وحذف الحساب ذاتيًا مع مهلة سماح مدتها 7 أيام.

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

النتائج

ما تستطيع الشركة فعله اليوم ولم تستطع فعله في 2021.

بيع منتجين بدلًا من ساعات العمل

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

إطلاق نشاط تجاري جديد دون نظام جديد

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

تمكين العملاء من الشراء والترقية بأنفسهم

حلّت صفحة واحدة لإدارة الاشتراك محلّ مساري دفع كانا منفصلين، وهي تحدّد حالة العميل على الخادم.

البيع عبر شركات أخرى

يدير الشركاء والموزّعون مجموعات عملائهم بعلاماتهم التجارية، ويفوترون لهم من جدول تستورده أنظمتهم. ولا يعرف العميل أبدًا من يملك المنصة التي يستخدمها.

التشغيل دون متابعة بشرية

تتولّى 88 مهمة مجدولة كل شيء، من مزامنة البيانات كل 30 ثانية إلى التقرير الشهري للإدارة، دون تدخل أحد.

الإجابة عن أسئلة المشتريات الصعبة

بعد الدمج، أصبحت كل مكتبة تعتمد عليها الواجهة تحظى بدعم مستمر من الجهة المطوّرة لها. وفي 2025، لم تكن الشركة تستطيع الإجابة عن هذا السؤال بصدق.

البيع بلغة أخرى

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

شرح نتائج الفحص

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

الاستغناء عن شراء بيانات تستطيع جمعها بنفسها

تأتي معلومات النطاقات الآن من أدوات مفتوحة المصدر، بدلًا من واجهة API مدفوعة تُحاسب على كل استعلام، وقد أُلغي الاشتراك.

تجاوز خسارة أحد المزوّدين

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

مواصلة العمل عند تعطّل الأنظمة التي تعتمد عليها

تحتفظ قاعدة بيانات المنصة بنتائج الفحص، منسوخةً سجلًا بسجل. وإذا توقف محرك الفحص، تواصل الخدمة التي يستخدمها العميل عملها.

إضافة خدمة دون إعادة بناء

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

الهندسة بالأرقام

  • 10 خدمات أمنية، تدخل خمس منها في التقييم
  • 10 خدمات خارجية مستخدمة فعليًا، نتحقق من سلامة عمل كل منها
  • 203 أنواع من السجلات في التطبيق الموحّد
  • 117 قاعدة صلاحيات نتحقق منها لكل سجل
  • 88 مهمة مجدولة
  • 82 رسالة بريد إلكتروني تلقائية في التطبيق الموحّد، جميعها مفهرسة ومتاحة للمعاينة
  • 470 تغييرًا طبّقناه في قاعدة البيانات، ولم يفقد أي عميل الخدمة
  • 121 شاشة أعدنا بناءها في التطبيق الموحّد
  • 5,351 نصًا في واجهة التطبيق الموحّد أصبح قابلًا للترجمة، بعدما كان العدد صفرًا
  • 39 نوعًا من سجلات محرك الفحص نُسخت إلى قاعدة بياناتنا
  • 13 عملية استماع مستمرة تُبقي نسخة البيانات محدّثة

الوضع الحالي بوضوح

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

هندسة الأمان

الشركة التي تبيع الفحص الأمني يجب أن تلتزم بالمعيار الذي تبيعه.

منذ البداية، صمّمنا الأمان ضمن كل طبقة من طبقات المنصة.

ما يمرّ به الطلب قبل الوصول إلى البيانات

يمرّ الطلب بخمس مراحل تحقق بالترتيب قبل الوصول إلى البيانات: النقل، والجلسة، والتفويض، والمدخلات، والملفات المرفوعة.

المدخلات

لا نثق بأيّ مدخلات يرسلها المستخدم

يمرّ كل نص منسّق يستطيع العميل إرساله عبر أداة تنقية تعتمد قائمة بما نسمح به، لا قائمة بما نحظره. تزيل الأداة السكربتات والإطارات المضمّنة والأنماط المضمّنة ومعالجات الأحداث، ولا تُبقي إلا مجموعة محدّدة من الوسوم وخصائص التنسيق وأنواع الروابط.

الملفات المرفوعة

نفحص كل ملف مرفوع بالكامل

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

التفويض

نتحقق من صلاحية الوصول إلى كل سجل

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

الجلسة

كلمات المرور تتبع نموذج NIST

الطول أهم من الرموز: 16 محرفًا للمسؤولين و14 للمستخدمين. ترفض قواعد مخصّصة كلمات القاموس، والكلمات المرتبطة بشركة العميل نفسها، والتسلسلات، وتسلسلات المفاتيح المتجاورة، والكلمات الموسمية والسنوات. وتعيد أولًا الأرقام والرموز المستخدمة بدل الحروف إلى أصلها، فتكتشف P@ssw0rd! كما تكتشف password.

الجلسة

نحمي الجلسات بعد تسجيل الدخول أيضًا

المصادقة الثنائية، وروابط دخول دون كلمة مرور، وقفل للحساب عند تكرار المحاولات الفاشلة، وجلسة نشطة واحدة لكل حساب، وشاشة قفل عند الخمول. وضبطنا زمن تسجيل الدخول بحيث تستغرق محاولة الدخول باسم مستخدم خاطئ المدة نفسها التي تستغرقها المحاولة بكلمة مرور خاطئة قبل رفضها.

النقل

نحمي الاستجابات وإشعارات webhooks والاستعلامات كلها

تتضمّن كل استجابة سياسة أمان المحتوى، وأمان النقل الصارم، مع وسائل حماية من اختطاف النقرات وتخمين نوع MIME، وضوابط للمُحيل والصلاحيات. وعند ورود بيانات من المزوّدين، نتحقق من صحة بيانات الاعتماد ونؤرشف البيانات قبل تحليلها. وفي التطبيق الموحّد، لا يصل أي إدخال من المستخدم إلى قاعدة البيانات في صورة SQL خام.

لا تحمي قائمة الحظر إلا من الحيل المعروفة حتى آخر تحديث لها. لذلك لا نستخدمها.

— Hesham Ghoniem، المهندس الرئيسي

أعمال ذات صلة

منصة الشحن الجوي والجمارك

الخدمات اللوجستية · 2025 – 2026 · تحديد المواصفات والبناء والنشر

7 أيام — من مستودع فارغ إلى واجهة API موثّقة تعمل فعليًا، وقّع الطرفان العقد بناءً عليها

جميع الأعمال

الخطوة التالية

هل لديك منتج يجب أن يستمر في البيع بينما تعيد بناء أسسه؟

اعمل مع فريق هندسي يستبدل أسس المنتج دون تجميد تطوير الميزات، ويقدّم لك القرارات الكبيرة مكتوبةً أولًا، ويدير الخوادم إلى جانب البرمجيات.

احجز مكالمة استكشافية

حُجبت هوية العميل · كل الأرقام محسوبة من مستودعات الكود المصدري · أكتوبر 2026