// docs / security guides / pre-launch SaaS
قائمة فحص أمان SaaS قبل الإطلاق: 35+ عنصرًا
أنت على بعد أيام من إطلاق منتج SaaS المصمم باستخدام Cursor أو Claude Code أو Lovable أو Bolt. قائمة المراجعة هذه عبارة عن تدقيق go/no-go يغطي الأسطح الأمنية التي تفتقدها أدوات AI باستمرار والتي يحتاج مؤسسو الشحن السريع إلى معالجتها قبل أخذ أموال العملاء. ثمانية أقسام، أكثر من 35 عنصرًا، يمكن حل كل منها خلال 30-90 دقيقة. اطبعها، وشطبها، وانشرها بثقة.
كل عنصر أدناه ضروري. اللون الأخضر يعني أنه تم شحنه والتحقق منه؛ اللون الأحمر يعني عدم حل وحظر الإطلاق. للحصول على معلومات تفصيلية أطول عن كل فئة مع مقتطفات التعليمات البرمجية وأنماط الفشل الحقيقية، راجع How to secure an app built with AI coding tools وThe vibe coding security checklist.
عزل بيانات العملاء
في SaaS متعدد المستأجرين، يكون الحد الأمني الأول هو عزل البيانات. يجب أن تكون بيانات كل عميل غير قابلة للوصول إلى أي عميل آخر، ويتم فرض ذلك في طبقة قاعدة البيانات، وليس طبقة التطبيق.
- قم بتمكين الأمان على مستوى الصف (RLS) في كل جدول Supabase باستخدام
ALTER TABLE public.table_name ENABLE ROW LEVEL SECURITY; ALTER TABLE public.table_name FORCE ROW LEVEL SECURITY;. FORCE يمنع مالك الجدول من تجاوزه. - بالنسبة لكل سياسة RLS، تحقق من النطاقات الأصلية للمستخدم أو المؤسسة التي تمت مصادقتها. مثال:
CREATE POLICY "users_see_own" ON public.items FOR SELECT USING (auth.uid() = user_id);. اختبر باستخدام حساب مستخدم ثانٍ للتأكد من بقاء البيانات معزولة. - إذا كنت تستخدم Firebase / Firestore، فيجب أن تتطابق القواعد مع نموذج المستأجر الخاص بك. لا تستخدم
allow read, write: if true;أو قواعد الاختبار المحددة بالوقت. استخدمallow read, write: if request.auth.uid == resource.data.owner_uid;أو ما يعادله من المطابقة على مستوى المؤسسة. - استخدم عناوين URL الموقعة أو الرموز المميزة قصيرة العمر للوصول إلى الملفات، وليس المستودعات العامة أبدًا. Supabase التخزين: قم بتعيين
ENABLE ROW LEVEL SECURITYعلى الجدولobjectsوسياسات المؤلف التي تحدد نطاق الوصول إلى الملف للمستخدم المصادق عليه. اختبار التنزيلات كمستخدمين مختلفين. - في طبقة API الخاصة بك، يجب أن يتضمن كل طلب
auth.uid()أو سياق معرف المؤسسة. يجب أن تتم تصفية كل استعلام في قاعدة البيانات حسب هذا السياق. مثال: لاSELECT * FROM items WHERE id = $1؛ دائماSELECT * FROM items WHERE id = $1 AND user_id = auth.uid().
الفواتير والدفع
Stripe التكامل هو المكان الذي تلتقي فيه ثقة العملاء بالسلامة المالية. يعني التكوين الخاطئ هنا المدفوعات المسروقة، أو حلقات استرداد الأموال، أو الإيرادات المفقودة.
- استخدم live Stripe keys في الإنتاج. اختبار باستخدام مفتاح وضع اختبار منفصل على التدريج. لا تقم مطلقًا بقلب المفتاح من الاختبار إلى البث المباشر دون إجراء فحص نهائي للوضع المباشر.
- تحقق من توقيع خطاف الويب في كل حدث وارد:
const event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);. رمي إذا فشل التوقيع. قم بتخزين سر خطاف الويب في متغير بيئة فقط، وليس في التعليمات البرمجية أبدًا. - قم بتنفيذ الصلاحيات على معالجات خطاف الويب باستخدام جدول قاعدة بيانات مرتبط بـ
event.id. إذا وصل خطاف الويب نفسه مرتين (سيصل)، فإن التشغيل الثاني يعتبر محظورًا. اكتب صف العجز في نفس المعاملة مع تغيير الحالة. - في
customer.subscription.updatedوcustomer.subscription.deleted، قم بإلغاء الوصول على الفور. لا تنتظر كرون. قم بالاختبار عن طريق إلغاء الاشتراك في Stripe Dashboard والتحقق من أن المستخدم مغلق خلال 5 ثوانٍ. - قم بتخزين العميل Stripe فقط ID والاشتراك ID في قاعدة البيانات الخاصة بك، وليس البطاقة الكاملة أو المفتاح API. استرجع حالة الاشتراك المباشر من Stripe على كل حدود المصادقة (تحميل الصفحة، API الاتصال، التحقق من cron). لا تقم بتخزين حالة الاشتراك مؤقتًا لمدة تزيد عن دقيقة واحدة.
المصادقة والجلسات
المصادقة هي هدف المهاجم من الدرجة الثانية في SaaS. يعد حساب المستخدم بمثابة ناقل للبيانات وطرق الدفع.
- استخدم
supabase.auth.getUser()في كل مسار محمي، ولا تستخدمgetSession()أبدًا.getSession()يقرأ ملف تعريف الارتباط الذي لم يتم التحقق منه؛getUser()يتحقق من صحة جانب الخادم JWT. في Next.js:const { data: { user } } = await supabase.auth.getUser();قبل تقديم المحتوى المحمي. - قم بتعيين
SameSite=Laxعلى ملفات تعريف الارتباط للمصادقة (Supabase تقوم المصادقة بذلك بشكل افتراضي). تحقق في DevTools → التطبيق → ملفات تعريف الارتباط. إذا رأيتSameSite=None، أضفsameSite: 'Lax'إلى تكوين الجلسة. - قم بتمكين MFA في حساب المسؤول الخاص بك. بالنسبة إلى واجهة المستخدم MFA، قم باختباره من البداية إلى النهاية قبل الإطلاق: قم بالتسجيل، وقم بتسجيل جهاز TOTP، ثم قم بتسجيل الخروج، ثم قم بتسجيل الدخول مرة أخرى باستخدام الرمز المميز TOTP، وتأكد من أنه يعمل.
- يجب أن تنتهي صلاحية الرموز المميزة لـ Magic-link خلال 15 دقيقة. يجب أن تنتهي صلاحية الرموز المميزة لإعادة تعيين كلمة المرور خلال ساعة واحدة. يمكن أن تستمر الرموز المميزة للجلسة (JWTs) لفترة أطول (24 ساعة - 7 أيام) ولكن يجب التحقق من صحتها عند كل استخدام. تحقق من الإعدادات الافتراضية لموفر المصادقة الخاص بك.
- اختبار اكتمال تسجيل الخروج: بعد أن ينقر المستخدم على تسجيل الخروج، يحذف المتصفح جلسة المصادقة، ويبطل الخادم أي رموز مميزة، ولا يمكن للمستخدم الوصول إلى الصفحات المحمية. في Supabase: اتصل بـ
await supabase.auth.signOut()وتحقق من أن JWT لم يعد صالحًا في الطلب التالي.
PII والامتثال
إذا قمت بجمع البريد الإلكتروني أو الاسم أو معلومات الدفع أو أي PII، فإن لديك التزامات قانونية: تقليل البيانات، والتخزين الآمن، والحذف عند الطلب، والاستعداد DPA.
- كتابة سياسة خصوصية ونشرها (ليست اختيارية، حتى بالنسبة إلى Indie SaaS). اذكر البيانات التي تجمعها، ولماذا، ومدة الاحتفاظ بها، وحقوق المستخدم (الوصول، التصحيح، الحذف). استخدم قالبًا من Termly أو ما شابه ولكن قم بتخصيصه.
- قم بتنفيذ نقطة نهاية حذف الحساب API والتي تقوم بإزالة PII من قاعدة البيانات. اختبره: أنشئ حسابًا، وأضف البيانات، واحذف الحساب، وتحقق من اختفاء البيانات (استخدم الفحص المباشر لقاعدة البيانات).
- للامتثال GDPR / CCPA، قم بالرد على طلبات أصحاب البيانات (الوصول / التصحيح / الحذف) في غضون 30 يومًا. قم بتوثيق عمليتك. إذا كان تطبيقك يستند إلى EU- أو يخدم EU المستخدمين، فيجب توفر ملحق بيانات Pro (DPA) مع Stripe وSupabase وأي معالج.
- قم بتشفير الحقول الحساسة في حالة عدم النشاط (يتم تجزئة كلمات المرور بواسطة موفر المصادقة الخاص بك؛ ولكن يجب أن تستخدم الرموز المميزة لبطاقة الائتمان، ومفاتيح API، والأسرار
pgcryptoأو قبو خارجي). لا تقم مطلقًا بتخزين أرقام بطاقات الائتمان ذات النص العادي (استخدم الرمز المميز Stripe بدلاً من ذلك).
الاستعداد التشغيلي
الأمن مستمر. تبدأ الاستجابة للحوادث والمراقبة ودفاتر التشغيل قبل اليوم الأول.
- قم بإعداد صفحة الحالة (Statuspage.io، أو Uptime Robot، أو index.html البسيط). يحتاج العملاء إلى معرفة ما إذا كان لديك انقطاع في الخدمة. قم بتحديثه في كل حادثة.
- قم بتوثيق واختبار التناوب عند الطلب. من يستيقظ على تنبيه الساعة الثانية صباحًا؟ من لديه مفاتيح النشر؟ من يمكنه إلغاء الرمز المميز المخترق؟ قم بتوثيق ذلك وإجراء تدريب على مكافحة الحرائق قبل الإطلاق.
- اكتب دليل تشغيل الاستجابة للحوادث الأمنية: ماذا تفعل إذا أبلغ العميل عن حدوث اختراق، أو إذا فقدت مفتاحًا، أو إذا تعطلت الخدمة. توزيعها على فريقك. قم باختبار سيناريو واحد (e.g.، محاكاة تسرب المفتاح) للتحقق من نجاح الخطة.
- يجب أن تكون إجراءات النسخ الاحتياطي والاستعادة اختبارية وليست نظرية. هل يمكنك الاستعادة من النسخ الاحتياطية؟ حان الوقت. Supabase: تمكين النسخ الاحتياطية التلقائية (الاحتفاظ لمدة 7 أيام مجانًا، و30 يومًا مدفوعًا). اختبار الاستعادة إلى مشروع منفصل كل ثلاثة أشهر.
- تمكين تسجيل التدقيق للعمليات المميزة: Stripe تسجيلات دخول لوحة المعلومات، Supabase مكالمات المسؤول API، وتغييرات مخطط قاعدة البيانات، وتسوية الدفع. الأدوات: CloudTrail (AWS)، Supabase سجلات التدقيق، ملحق PostgreSQL
pgaudit.
سطح الهجوم الخارجي
حدودك API تخضع لفحص مهاجم مستمر. قم بتأمينه قبل وصول حركة المرور الضارة.
- معدل الحد لكل نقطة النهاية العامة. مثال: 100 طلب في الدقيقة لكل IP عند التسجيل، و10 في الدقيقة عند إعادة تعيين كلمة المرور. استخدم Vercel KV أو Redis أو ما شابه. فشل مع 429 (طلبات كثيرة جدًا).
- أضف CAPTCHA (hCaptcha أو reCAPTCHA) إلى نقاط نهاية التسجيل وإعادة تعيين كلمة المرور للتغلب على الروبوتات. تحقق من جانب خادم الرمز المميز قبل قبول الطلب.
- استخدم WAF (جدار حماية تطبيق الويب) إذا كان متاحًا: Cloudflare أو Vercel جدار حماية تطبيق الويب أو AWS WAF. حظر عناوين IP والأنماط الضارة المعروفة تلقائيًا.
- البحث عن نقاط النهاية المفتوحة API. قم بإجراء فحص سلبي FixVibe على مجال الإنتاج الخاص بك شهريًا. قم بمراجعة النتائج الخاصة بطرق تصحيح الأخطاء المكشوفة، أو GraphQL الاستبطان، أو API، أو تسرب المفاتيح، أو التعرض للتكوين.
- قم بتدوير بيانات الاعتماد (API المفاتيح، OAuth الرموز المميزة، وكلمات مرور قاعدة البيانات) ربع سنوي. توثيق إجراء التناوب وأتمتته حيثما أمكن ذلك.
إمكانية الملاحظة والتسجيل
عندما تسوء الأمور، فإن السجلات هي سجل الطب الشرعي الخاص بك. قم بإعدادهم من اليوم الأول.
- مركزية السجلات: Supabase السجلات وVercel والسجلات وسجلات التطبيق وسجلات المصادقة في لوحة معلومات واحدة (Datadog أو LogRocket أو ELK المستضافة ذاتيًا). قابلة للبحث، ويتم الاحتفاظ بها لمدة 90 يومًا على الأقل.
- تنبيه بشأن الأحداث الأمنية: عمليات تسجيل الدخول الفاشلة المتكررة (احتمال الاستيلاء على الحساب)، والاستخدام غير المعتاد API (احتمال الحذف)، وارتفاع الأخطاء (هجوم محتمل أو حادث مشروع). تعيين العتبات وتكاملات Slack.
- قم بإصدار سجلات التدقيق لكل عملية ذات امتيازات: تغييرات دور المستخدم، وإنشاء حساب مسؤول جديد، وإضافات طريقة الدفع، وتغييرات النطاق في مفاتيح API. قم بتخزينها بشكل منفصل عن سجلات التطبيق مع الاحتفاظ غير القابل للتغيير.
التحقق النهائي
قبل أن تعلن، قم بإجراء فحص كامل FixVibe وراجع النتائج بعين أمنية.
- قم بإجراء فحص نشط FixVibe Pro على مجال الإنتاج الخاص بك. قم بتكوين المجال الخاص بك للاختبار النشط (DNS TXT أو HTTP التحقق من الملف). قم بالموافقة على الفحص ومراجعة كل النتائج - وخاصة الحرجة والعالية الخطورة. قم بإصلاح أو قبول كل واحد بشكل صريح.
- تمكين عمليات إعادة الفحص المجدولة: Pro الخطة → 3 ساعات، 6 ساعات، 12 ساعة، أو يوميًا. خطة Unlimited → 6 ساعات، 12 ساعة، يوميًا، كل يومين، أو أسبوعيًا. قم بالاقتران مع عمليات التحقق active IDOR walking وSQL injection وreflected XSS على المجال الذي تم التحقق منه.
- قم بتكوين خطافات الويب: قم بتوصيل FixVibe بـ Slack أو أرسل بريدًا إلكترونيًا حتى تؤدي النتائج المهمة إلى تشغيل التنبيهات في الوقت الفعلي. راجع /docs/webhooks للإعداد.
- قم بإجراء مراجعة نهائية للكود يدويًا مع التركيز على المشاكل الموجودة في /docs/security-guides/ai-generated-code-security-scanner: الأسرار في الحزم، RLS/rules، حدود المصادقة، CSP، وضع البرامج الوسيطة. استخدم vibe coding security checklist كقالب المراجعة.
يوم الإطلاق
لقد قمت بمسح قائمة التحقق. انشر بثقة. بعد الإطلاق، قم بالمراقبة النشطة: تحقق من FixVibe النتائج يوميًا خلال الأسبوع الأول، واستجب للتنبيهات خلال ساعة واحدة، واستمر في تشغيل جدول الفحص. للحصول على دليل التعزيز خطوة بخطوة مع مقتطفات التعليمات البرمجية، راجع How to secure an app built with AI coding tools.
