cybersecurity

قائمة تحقق أمان SaaS قبل الإطلاق: 40 فحصًا نُجريها أولًا (2026)

بقلم Mert Batur
Jul 23, 2026
14 قراءة
قائمة تحقق أمان SaaS قبل الإطلاق: 40 فحصًا نُجريها أولًا (2026)

قائمة تحقق أمان SaaS قبل الإطلاق: 40 فحصًا نُجريها أولًا (2026)

قائمة تحقق أمان SaaS قبل الإطلاق تُساوي أكثر من كومة شهادات امتثال لم تحصل عليها بعد. إليك الحقيقة غير المريحة: معظم قوائم تحقق الإطلاق تخبرك بما يجب تأمينه ولا تُريك كيف أبدًا. هذه القائمة تُقدّم الكود مباشرة. نحن نبني على Next.js وSupabase، وقد شاهدنا فلتر tenant_id واحد مفقود يسمح لحساب اختبار بقراءة بيانات عميل آخر، وقد وضع تقرير IBM لتكلفة اختراق البيانات لعام 2024 المتوسط العالمي عند $4.88M. لست بحاجة إلى SOC 2 لتبدأ التشغيل. أنت بحاجة إلى خط الأساس على مستوى التطبيق أدناه، مُصنّفًا في مجموعات، وقابلًا للتنفيذ، ومربوطًا بمعياري OWASP وNIST.

الخلاصة الرئيسية

  • لا تحتاج إلى SOC 2 أو اختبار اختراق لتُطلق. تحتاج إلى خط الأساس على مستوى التطبيق أدناه.
  • أخطر خلل عند الإطلاق هو تسرّب بيانات عبر المستأجرين ناتج عن فحص tenant_id مفقود.
  • لا تبنِ نظام مصادقة خاصًا بك أبدًا. استخدم Auth.js أو Clerk أو Supabase Auth.
  • دقّق بادئات NEXT_PUBLIC_ قبل النشر. هذه أسرع طريقة لتسريب سرّ.

يرتبط خط الأساس هذا بمعيار OWASP ASVS 5.0 وإطار NIST لتطوير البرمجيات الآمن (SSDF)، وهما المرجعان اللذان تثق بهما Google أكثر من غيرهما في هذا الموضوع، والمرجعان اللذان لا يكلّف أي من الأدلة الأعلى ترتيبًا في نتائج البحث نفسه عناء الاستشهاد بهما.

قائمة تحقق الأمان الخاصة بك قبل الإطلاق (النسخة السريعة)

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

الأسرار والإعدادات

  1. .env موجود في .gitignore منذ أول التزام (commit) ولم يُرفع إلى المستودع قط.
  2. تم تدقيق كل بادئة NEXT_PUBLIC_ وVITE_؛ لا شيء سرّي يصل إلى المتصفح.
  3. أسرار الخادم تعيش في مدير أسرار (متغيرات بيئة المنصة، AWS Secrets Manager، Vault)، لا في المستودع.
  4. أي مفتاح مسّ سجل git التاريخي يُدوَّر قبل الإطلاق.
  5. لا تظهر أي أسرار في السجلات أو استجابات الأخطاء أو حزمة العميل.
  6. قمت بفحص الحزمة المبنية بحثًا عن مفاتيح فعلية (grep -r "sk_live" .next/).

المصادقة والوصول

  1. المصادقة مبنية على مكتبة (Auth.js أو Clerk أو Supabase Auth)، وليست مصنوعة يدويًا.
  2. المصادقة متعددة العوامل (MFA) متاحة على الحسابات.
  3. تُحدَّد ملفات تعريف ارتباط الجلسة بخصائص Secure وHttpOnly وSameSite.
  4. لا تُخزَّن رموز JWT أو رموز الجلسة في localStorage.
  5. يُطبَّق التحكم بالوصول القائم على الأدوار (RBAC) ومبدأ أقل الصلاحيات من جهة الخادم، لا بمجرد إخفائه في الواجهة.
  6. تُشفَّر كلمات المرور بـArgon2 أو bcrypt (فقط إذا كنت تُدير المصادقة بنفسك).
  7. تدفقات إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني مُختبَرة ضد إساءة الاستخدام.

البيانات والاستئجار المتعدد

  1. يحمل كل استعلام فلتر tenant_id.
  2. يُطبَّق نطاق المستأجر على مستوى ORM أو طبقة المستودع، لا بحفظه ذهنيًا لكل استعلام.
  3. الأمان على مستوى الصفوف (Row-Level Security) مُفعَّل ووضع فشله معروف.
  4. تُجري كل نقطة نهاية تعتمد على معرّف كائن فحص ملكية (هذا ما يقضي على IDOR).
  5. يُدرَج tenant_id في مفاتيح التخزين المؤقت ومسارات تخزين الكائنات.
  6. تُشفَّر البيانات أثناء التخزين وأثناء النقل.
  7. تُتحقَّق تواقيع الدفع والـwebhook (Stripe وغيره) من جهة الخادم.

التبعيات وسلسلة التوريد

  1. npm audit أو pnpm audit خالٍ من النتائج عالية وحرجة الخطورة (أو تمت مراجعتها صراحةً).
  2. Dependabot أو Renovate مُفعَّل.
  3. Snyk أو Socket يُجريان تحليلًا أعمق لسلسلة التوريد إضافة إلى فحوصات البرمجيات الخبيثة والتراخيص.
  4. ملف القفل (lockfile) مُلتزَم به في المستودع.
  5. لا حزم مهجورة أو غير مُصانة تقع في المسار الحرج.
  6. صور الحاويات تُفحَص إن كنت تنشر عبر Docker.

الشبكة والنقل

  1. HTTPS مُطبَّق في كل مكان، مع تفعيل HSTS preload.
  2. سياسة أمان المحتوى (Content-Security-Policy) مُحدَّدة (تقرير فقط أولًا، ثم إنفاذ).
  3. X-Content-Type-Options: nosniff وX-Frame-Options/frame-ancestors مُحدَّدان.
  4. Referrer-Policy وPermissions-Policy مُحدَّدان.
  5. CORS يستخدم قائمة سماح، وليس * مع بيانات اعتماد.
  6. تحديد المعدل (Rate Limiting) يحمي نقاط المصادقة والنقاط المكلفة.
  7. تتحقق كل نقطة نهاية من المدخلات عبر مخطط (Zod أو ما شابه).

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

  1. سجلات تدقيق مركزية تُسجّل من وصل إلى ماذا، ومتى.
  2. معالجة الأخطاء لا تُسرّب أبدًا تتبعات المكدس (stack traces) للمستخدمين.
  3. تنطلق تنبيهات عند شذوذات المصادقة (ارتفاع محاولات تسجيل الدخول الفاشلة، السفر المستحيل).
  4. النسخ الاحتياطية الآلية تعمل، وقد اختبرت عملية استعادة.
  5. يوجد جهة اتصال للاستجابة للحوادث ودليل تشغيل من صفحة واحدة.
  6. مراقبة وقت التشغيل والأخطاء (Sentry أو ما يعادلها) نشطة.
  7. تعرف المُحفّز الذي يستدعي الاستعانة باختبار اختراق.

أولوية الإصلاح أولًا

ليس كل بند يعيق الإطلاق. يُرتّب جدول الفرز هذا خط الأساس حسب حجم الضرر إن تم تخطيه، ليعرف المؤسس ما هو غير قابل للتفاوض. P0 = أصلحه قبل الإطلاق، P1 = أصلحه في الأسبوع الأول، P2 = أصلحه خلال هذا الربع.

البندالفئةإن تخطّيتهجهد الإصلاحعائق أمام الإطلاق؟
عزل المستأجرين على كل استعلامالبيانات والاستئجار المتعددعميل يقرأ بيانات عميل آخرمتوسطP0: يوقف الإطلاق
إخراج الأسرار من حزمة العميلالأسرار والإعداداتمفاتيح API علنية، سيطرة على الحسابمنخفضP0: يوقف الإطلاق
فحص الملكية على نقاط نهاية معرّف الكائنالبيانات والاستئجار المتعددIDOR: زيادة رقم المعرّف تُسرّب سجلاتمنخفضP0: يوقف الإطلاق
المصادقة عبر مكتبة، لا يدويًاالمصادقة والوصولأخطاء مصادقة مشحونة، جلسات معطوبةمتوسطP0: يوقف الإطلاق
HTTPS وHSTS في كل مكانالشبكة والنقلسرقة الرموز عبر الشبكةمنخفضP0: يوقف الإطلاق
npm audit خالٍ من العالي/الحرجالتبعياتثغرة CVE معروفة في تبعية غير مباشرةمنخفضP1: الأسبوع الأول
تحديد المعدل على نقاط المصادقةالشبكة والنقلحشو بيانات الاعتماد، القوة الغاشمةمنخفضP1: الأسبوع الأول
ترويسات الأمان (CSP، HSTS، nosniff)الشبكة والنقلXSS، clickjacking، هجمات MIMEمنخفضP1: الأسبوع الأول
سجلات تدقيق مركزيةالمراقبةلا يمكنك رؤية أو إثبات اختراقمتوسطP1: الأسبوع الأول
استعادة نسخة احتياطية مُختبَرةالمراقبةنسخة احتياطية لا تُستعاد لا قيمة لهامتوسطP1: الأسبوع الأول
المصادقة متعددة العوامل متاحة على الحساباتالمصادقة والوصولسهولة أكبر للسيطرة على الحسابمنخفضP2: هذا الربع
إنفاذ CSP كامل بعد مرحلة التقرير فقطالشبكة والنقلسطح XSS متبقٍمتوسطP2: هذا الربع

الأسرار والإعدادات: هل تتسرّب أي مفاتيح إلى حزمة العميل؟

نظافة الأسرار عند الإطلاق تعني ألّا تصل أي بيانات اعتماد إلى المتصفح أبدًا. بادئة NEXT_PUBLIC_ في Next.js (وبادئة VITE_ في Vite) تشحن القيمة إلى كل زائر، لذا تكفي بادئة واحدة خاطئة لتسريب مفتاح. أبقِ .env خارج git، وضع أسرار الخادم في مدير أسرار، وافحص مخرجات البناء بـgrep قبل النشر.

إليك الفخ الأكثر شيوعًا الذي نراه: NEXT_PUBLIC_ لا تعني "معلومة عامة". بل تعني حرفيًا "أنا أشحن هذا إلى متصفح كل زائر". ضع سرّ Stripe أو مفتاح دور خدمة خلف هذه البادئة، وسيصبح حيًّا في الحزمة لأي شخص يفتح أدوات المطوّر (DevTools).

bash
# .env.local (الخطأ)
NEXT_PUBLIC_STRIPE_SECRET=sk_live_51H...   # سيّئ: يُشحن إلى كل متصفح
STRIPE_SECRET_KEY=sk_live_51H...           # جيد: للخادم فقط

# عام (آمن للكشف) مقابل خاص بالخادم فقط
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...       # المفتاح المجهول مُصمَّم ليكون عامًا
SUPABASE_SERVICE_ROLE_KEY=eyJ...           # لا تضعه أبدًا خلف NEXT_PUBLIC_

# اكشف مفتاحًا مسرَّبًا قبل النشر
grep -r "sk_live" .next/    # أي نتيجة تعني وجود سرّ في حزمة العميل

بقية خط الأساس للأسرار مُملّة وغير قابلة للتفاوض: .env في .gitignore منذ أول التزام، وأسرار الخادم في مدير أسرار لا في المستودع، وتدوير أي مفتاح مسّ سجل git التاريخي على الإطلاق (حذف التزام لا يُلغي التسريب). رمز نشر مُسرَّب هو بالضبط كيف تبدأ اختراقات مثل حادثة Vercel، لذا تعامل مع كل رمز وكأنه بالفعل على قائمة مراقبة أحدهم.

المصادقة والوصول: هل تبني نظام مصادقة أم تستخدم مكتبة؟

هل تبني نظام مصادقة بنفسك أم تستخدم مكتبة؟ استخدم مكتبة في كل الأحوال تقريبًا. Auth.js وClerk وSupabase Auth استوعبت سنوات من الحالات الحرجة التي ستكتشفها مجددًا في الإنتاج لو بنيتها بنفسك: تثبيت الجلسة، إبطال الرموز، إساءة استخدام تدفق إعادة التعيين. بناء نظامك الخاص مُبرَّر فقط إن كان لديك مهندس أمن وسبب لا يناسبه أي مزوّد، وهذا نادر.

بناء مصادقة خاصة بك هو أغلى طريقة لتوفير $25 شهريًا. إليك كيف تُقارَن الخيارات بصدق.

الخيارالأنسب متىمصادقة متعددة العوامل مدمجةالجلسة الافتراضيةالفخ
Auth.js (NextAuth)تريد حلًا مجانيًا ومُستضافًا ذاتيًا وتحكمًا كاملًاعبر مزوّدين/إضافاتJWT أو قاعدة بياناتأنت تملك كل حالة حرجة أمنية
Clerkتريد المصادقة متعددة العوامل والواجهة والمؤسسات جاهزةنعممُدارةالفئات المدفوعة تتوسّع مع المستخدمين النشطين
Supabase Authتُشغّل بالفعل Supabase وPostgres RLSنعمJWTجودة سياسات RLS مسؤوليتك
بناء نظامك الخاصلديك مهندس أمن ولا يناسبك أي مزوّدتبنيها بنفسكتبنيها بنفسكمعظم أخطاء المصادقة تبدأ هنا بالضبط

فخّان يُغرقان الفرق التي تختار مكتبة ثم تتخطى الإعداد. أولًا، إبطال JWT صعب فعلًا، لذا يبقى الرمز المسروق صالحًا حتى انتهاء صلاحيته؛ اجعل عمر الرموز قصيرًا وفضّل جلسات جهة الخادم لأي شيء حساس. ثانيًا، الرموز في localStorage قابلة للسرقة بأي حمولة XSS، لذا خزّن الجلسات في ملفات تعريف ارتباط httpOnly مع Secure وSameSite. طبّق RBAC من جهة الخادم، لا بإخفاء الأزرار في الواجهة.

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

البيانات والاستئجار المتعدد: كيف تمنع مستأجرًا من قراءة بيانات مستأجر آخر؟

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

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

ts
// سيّئ: بلا نطاق مستأجر. أي معرّف صالح يُعيد صف أي مستأجر.
const order = await db.order.findFirst({ where: { id } });

// جيد: محصور بمستأجر المُستدعي في كل عملية قراءة.
const order = await db.order.findFirst({
  where: { id, tenantId: session.tenantId },
});

الخلل المرتبط بهذا هو IDOR (مرجع كائن مباشر غير آمن)، الذي تُصنّفه قائمة OWASP API Security Top 10 تحت البند API1: كسر التفويض على مستوى الكائن. حساب اختبار يزيد معرّفًا في عنوان URL ويقرأ سجلًا لا يفترض أن يراه أبدًا. تقدّم أكاديمية PortSwigger لأمان الويب شرحًا كاملًا لكيفية اكتشاف المهاجمين لهذه الثغرات. الإصلاح هو فحص ملكية واحد.

ts
// GET /api/invoices/1234، حساب اختبار يزيد المعرّف
// ويقرأ فاتورة مستأجر آخر. حالة BOLA كلاسيكية.
const invoice = await db.invoice.findUnique({ where: { id } });

// الإصلاح: تحقّق من الملكية قبل إعادة أي شيء.
if (invoice.tenantId !== session.tenantId) {
  return res.status(403).json({ error: "Forbidden" });
}

إليك الإطار الذي يُبقيك صادقًا: كل IDOR هو فشل في عزل المستأجرين، لكن ليس كل فشل في عزل المستأجرين هو IDOR. الأمان على مستوى الصفوف في Postgres يلتقط كثيرًا منها على مستوى قاعدة البيانات، لكن له أنماط فشل صامتة تستحق المعرفة قبل الاعتماد عليه.

sql
-- أمان الصفوف في Postgres: حزام أمان، لا درع واقٍ.
alter table orders enable row level security;

create policy tenant_isolation on orders
  using (tenant_id = current_setting('app.tenant_id')::uuid);
-- فخ الفشل الصامت: انسَ تنفيذ SET app.tenant_id على اتصال
-- من مجمّع اتصالات، وستقرأ السياسة مستأجر الطلب السابق.

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

التبعيات وسلسلة التوريد: ماذا يختبئ داخل node_modules؟

تطبيقك آمن بقدر أضعف تبعية غير مباشرة فيه فقط. شغّل npm audit أو pnpm audit في CI وأفشل البناء عند نتائج عالية أو حرجة الخطورة قبل أي إطلاق. أضف Dependabot أو Renovate للتحديثات التلقائية، وSnyk أو Socket لفحوصات أعمق للبرمجيات الخبيثة والتراخيص.

الفخ هو تشغيل الفحص مرة واحدة يدويًا، ورؤية إشارة خضراء، وعدم تشغيله مجددًا أبدًا. اربطه بـCI حتى تحجب ثغرة CVE جديدة في حزمة لم تلمسها الدمج (merge) رغم ذلك.

yaml
# .github/workflows/ci.yml: احجب الدمج عند نتائج عالية/حرجة
- name: Audit dependencies
  run: npm audit --audit-level=high    # خروج غير صفري يُفشل المهمة

تُغطّي وثائق npm audit مستويات الخطورة وعلامة --production إن أردت تجاهل النتائج الخاصة بالتطوير فقط. الفحص الآلي شرط أساسي لا أكثر؛ للتحليل الساكن الأعمق الذي يلتقط روائح الكود ومسارات الحقن التي يُفوّتها فاحص التبعيات، راجع مراجعتنا لـSonarQube. التزم بملف القفل في المستودع، وتخلَّ عن الحزم التي لم تُصدر إصدارًا منذ سنوات، وافحص صورة الحاوية إن كنت تنشر عبر Docker.

الشبكة والنقل: ما ترويسات الأمان التي يحتاجها SaaS فعليًا؟

ما ترويسات الأمان التي يحتاجها SaaS؟ HTTPS إضافة إلى HSTS ومجموعة قصيرة من الترويسات تُغلق أسهل الثغرات استغلالًا. أضف سياسة أمان محتوى (Content-Security-Policy)، وقائمة سماح لـCORS بدلًا من حرف بدل، وحدود معدّل على نقاط المصادقة والنقاط المكلفة. تحقق من كل مُدخل عبر مخطط مثل Zod حتى لا تصل الحمولات السيئة إلى منطق تطبيقك أبدًا.

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

الترويسةالقيمة الموصى بهاما الذي توقفه
Strict-Transport-Securitymax-age=63072000; includeSubDomains; preloadتخفيض بروتوكول، هجمات إزالة SSL
Content-Security-Policydefault-src 'self'; ابدأ بوضع التقرير فقطXSS، سكريبتات مُحقنة، تسريب بيانات
X-Content-Type-Optionsnosniffاستنشاق MIME الذي يحوّل رفعًا إلى سكريبت
X-Frame-Options / frame-ancestorsDENY (أو frame-ancestors 'none')Clickjacking عبر إطارات iframe مخفية
Referrer-Policystrict-origin-when-cross-originتسريب عناوين URL كاملة (والرموز داخلها)
Permissions-Policycamera=(), microphone=(), geolocation=()سكريبتات مارقة تلمس واجهات برمجة الجهاز

حدّد الترويسات مرة واحدة، عند الحافة (edge)، وأضف محدّد معدّل حتى لا يستطيع سكريبت مهاجمة مسار تسجيل الدخول لديك بالقوة الغاشمة طوال الليل.

js
// next.config.js: ترويسات أمان على كل استجابة
const securityHeaders = [
  { key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" },
  { key: "X-Content-Type-Options", value: "nosniff" },
  { key: "X-Frame-Options", value: "DENY" },
  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];
// حدّد معدّل مسارات المصادقة (مثال Upstash)
const { success } = await ratelimit.limit(ip);
if (!success) return new Response("Too many requests", { status: 429 });

ابدأ CSP في وضع التقرير فقط حتى لا تُعطّل تطبيقك بنفسك، وراقب تقارير الانتهاكات لبضعة أيام، ثم حوّله إلى وضع الإنفاذ. أبقِ CORS على قائمة سماح مُسمّاة، ولا تجمع أبدًا بين * وبيانات الاعتماد.

المراقبة والاستجابة: كيف ستعرف أنك تعرّضت للاختراق؟

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

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

يعتمد كشف الاختراقات الحديث على مراقبة الشذوذ بدلًا من القواعد الثابتة؛ اقرأ المزيد عن آلية عمل ذلك فعليًا في مقالنا عن كيف يمنع الذكاء الاصطناعي اختراقات البيانات. أما بخصوص الإطار الداعم، فيشرح NIST SSDF (SP 800-218) ممارسات الاستجابة والمراقبة بلغة واضحة. اختبر عملية استعادة قبل الإطلاق، لا بعد اختفاء قاعدة بياناتك.

ما الذي نجده فعليًا عند مراجعة إطلاقاتنا الخاصة

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

خطأ نطاق المستأجر هو الأكثر إثارة للقلق لأن التطبيق يبدو سليمًا. كل صفحة تُحمَّل. لا يظهر الخلل إلا عندما يغيّر أحدهم معرّفًا في عنوان URL. في إحدى المراجعات، كانت GET /api/orders/:id تُعيد أي طلب لأي مستخدم مسجّل الدخول؛ وقرأ حساب اختبار طلبات مستأجر آخر بزيادة الرقم فقط. كان الإصلاح سطرين اثنين: قارن order.tenantId بـsession.tenantId قبل الإعادة.

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

إن كنت تفضّل أن يُجري فريق هذا الفحص نيابةً عنك قبل يوم الإطلاق، فهذا هو العمل الذي نقوم به. احصل على مراجعة أمان قبل الإطلاق ←

عن الكاتب

Mert Batur, Co-Founder, Techsy.io. تواصل عبر LinkedIn.

Mert Batur هو المؤسس المشارك لـTechsy.io، حيث يشحن الفريق وكلاء ذكاء اصطناعي، وأنظمة أتمتة، وخطوط أنابيب صوتية/SDR لعملاء B2B. يكتب عن حزمة أدوات LLM التي يستخدمها فريق Techsy فعليًا في الإنتاج.

الأسئلة الشائعة

ما الذي يجب أن يكون في قائمة تحقق أمان SaaS قبل الإطلاق؟

ست فئات: الأسرار والإعدادات (أبقِ المفاتيح خارج حزمة العميل)، المصادقة والوصول (استخدم مكتبة، أضف المصادقة متعددة العوامل)، البيانات والاستئجار المتعدد (نطاق tenant_id إضافة إلى فحوصات الملكية)، التبعيات (npm audit في CI)، الشبكة والنقل (HTTPS، HSTS، CSP، حدود المعدّل)، والمراقبة والاستجابة (سجلات تدقيق، نسخ احتياطية مُختبَرة، دليل تشغيل).

هل SaaS الخاص بي آمن بما يكفي للإطلاق؟

أنت جاهز عندما ينتهي خط الأساس P0: الأسرار خارج حزمة العميل، عزل المستأجرين على كل استعلام، مصادقة عبر مكتبة، HTTPS مع ترويسات أمان، وفحص تبعيات نظيف. الكمال ليس هو المعيار. تطبيق مشحون ومراقَب مع تغطية خط الأساس أفضل من تطبيق "مثالي" لا يُطلق أبدًا.

هل أحتاج إلى اختبار اختراق قبل إطلاق SaaS؟

ليس لكي تُطلق قانونيًا. أعطِه الأولوية إن كنت تتعامل مع مدفوعات أو بيانات شخصية (PII)، أو تستهدف مشترين من فئة المؤسسات، أو طلبه مدقق أو مستثمر. في مرحلة MVP، وجّه ذلك الجهد أولًا إلى خط الأساس على مستوى التطبيق وقائمة OWASP Top 10. يكتشف اختبار الاختراق المزيد عندما تكون ثغرات IDOR والترويسات الواضحة مُغلقة بالفعل.

هل أحتاج إلى SOC 2 لإطلاق SaaS؟

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

هل أبني نظام مصادقتي الخاص أم أستخدم مكتبة مثل Auth.js أو Clerk أو Supabase Auth؟

استخدم مكتبة في كل الأحوال تقريبًا. تعاملت Auth.js وClerk وSupabase Auth مع حالات الجلسة والرموز وإعادة التعيين الحرجة التي تُسبّب معظم أخطاء المصادقة المبنية ذاتيًا. بناء نظامك الخاص مُبرَّر فقط إن كان لديك مهندس أمن ومتطلب صارم لا يُلبّيه أي مزوّد، وهذا نادر فعلًا.

كيف أُبقي الأسرار خارج حزمة العميل الخاصة بي؟

دقّق كل بادئة NEXT_PUBLIC_ وVITE_، لأن أي شيء يحمل هذه البادئة يُشحن إلى المتصفح. أبقِ .env خارج git منذ أول التزام، وخزّن أسرار الخادم في مدير أسرار، وافحص الحزمة المبنية (grep -r "sk_live" .next/) قبل النشر لاكتشاف أي مفتاح مُسرَّب.

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

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

ما ترويسات الأمان التي يحتاجها SaaS قبل الإطلاق؟

كحد أدنى: Strict-Transport-Security (HSTS)، وسياسة أمان محتوى (Content-Security-Policy)، وX-Content-Type-Options: nosniff، وX-Frame-Options أو frame-ancestors، وReferrer-Policy، وPermissions-Policy. ابدأ CSP في وضع التقرير فقط، وراجع الانتهاكات، ثم فعّل الإنفاذ. تسرد وثائق ترويسات الأمان في MDN القيم الموصى بها لكل واحدة، ويُلخّص جدول الترويسات أعلاه ما توقفه كل واحدة منها.

هل الفحص الآلي مثل npm audit أو Snyk كافٍ؟

ضروري لكنه غير كافٍ. أدوات مثل npm audit وSnyk وSocket تلتقط ثغرات CVE المعروفة والحزم الخبيثة، لكنها لا تستطيع اكتشاف عيوب منطق العمل والتحكم بالوصول مثل IDOR أو نطاق مستأجر مفقود. تلك تحتاج إنسانًا، وحساب اختبار، وفحص ملكية صريحًا. شغّل الاثنين معًا: الفاحص الآلي والمراجعة اليدوية.

الخلاصة: قائمة تحقق أمان SaaS يمكنك شحنها فعليًا

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

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

الوسوم

قائمة تحقق أمان saas قبل الإطلاقأفضل ممارسات أمان saasعزل المستأجرينowasp asvsقائمة تحقق الأمان قبل الإطلاق

شارك هذا المقال

مقالات ذات صلة

المزيد في cybersecurity

cybersecurity
May 20, 2026

اختراق GitHub عبر إضافة VS Code (مايو 2026): دليل الطوارئ الـ 60 دقيقة الذي يجب على كل مطوّر تنفيذه الليلة

أكّد GitHub أن 3,800 مستودع داخلي تم تسريبه عبر إضافة VS Code خبيثة في 20 مايو 2026. هذا هو دليل الـ 60 دقيقة الذي يجب على كل مطوّر تنفيذه الليلة — إضافة إلى المفهوم الخاطئ الذي تناقلته العناوين الإخبارية.

14 دقيقة للقراءة قراءة
اقرأ
cybersecurity
May 8, 2026

كيف يمنع الذكاء الاصطناعي اختراقات البيانات: 7 دفاعات أوقفت هجمات حقيقية (2026)

في 30 أبريل 2026، اكتشف نحو 275 مليون طالب ومعلم أن منصة Canvas التعليمية تعرضت لاختراق. هل كان بإمكان الذكاء الاصطناعي منعه؟ إليك 7 دفاعات تعمل بالفعل في الإنتاج، وكيف تبنيها في تطبيقك هذا الأسبوع.

13 دقائق قراءة قراءة
اقرأ
cybersecurity
May 5, 2026

Copy Fail (CVE-2026-31431): دليل الطوارئ لإصلاح الثغرة في 60 دقيقة على Linux وKubernetes وبنية الذكاء الاصطناعي

أفصحت Microsoft عن CVE-2026-31431 ('Copy Fail') في الأول من مايو 2026 — ثغرة رفع صلاحيات في نواة Linux تتجاوز seccomp بإعداد RuntimeDefault وتُعرِّض كل عنقود inference متعدد المستأجرين وكل بيئة تشغيل وكلاء ذكاء اصطناعي وكل runner لـCI للخطر. إليك دليل الإصلاح في 60 دقيقة مع أوامر لكل توزيعة وملف seccomp جاهز للنسخ وتحليل مفصَّل لتعرُّض بنية الذكاء الاصطناعي.

12 min read قراءة
اقرأ
ابدأ مشروعك

هل أنت مستعد لبناء شيء استثنائي؟

دعنا نحول رؤيتك إلى واقع. فريقنا جاهز لمساعدتك في إنشاء برمجيات تصنع الفرق.