// docs / security guides / pre-ship checklist
قائمة فحص أمان vibe coding: 51 عنصرًا قبل الإطلاق
قائمة مرجعية عملية ومنظمة على مراحل للتطبيقات التي تم إنشاؤها باستخدام Cursor وClaude Code وLovable وBolt وv0 وReplit وWindsurf. كل عنصر قابل للتنفيذ في أقل من خمس دقائق. قم بالمراجعة قبل الانتقال إلى مرحلة الإنتاج، ثم مرة أخرى قبل كل إصدار رئيسي. يتم تجميع العناصر في سبع فئات - الأسرار، وقاعدة البيانات، والمصادقة، والرؤوس، والجهات الخارجية، والنشر، والمراقبة - ويتم وضع علامة عليها بمرحلة النشر التي تنطبق عليها.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
الأسرار ومفاتيح API (8 عناصر)
تعد المفاتيح المشفرة هي النتيجة الوحيدة الأكثر شيوعًا في التطبيقات المشفرة. ثمانية عناصر لإبعادهم:
- PRE — Audit
NEXT_PUBLIC_env vars. يتم شحن أي شيء مسبوق بـNEXT_PUBLIC_في حزم العميل. إذا كان أحد المفاتيح هو Supabaseservice_role(يتم فك ترميزه إلى JWT باستخدام"role":"service_role")، فاحذفه وقم بالتوجيه عبر عميل الخادم فقط (src/lib/supabase/service.tsمعimport 'server-only'). - PRE — Grep for hardcoded provider keys. مصدر البحث عن
sk_live_،pk_live_،STRIPE_SECRET،sk-ant-،sk-،AIza،AKIA، وJWT- أبحث عن سلاسل (eyJ). انقل كل نتيجة إلى.env.localوقم بالإشارة إليها عبرprocess.env.*من جانب الخادم فقط. - PRE — Verify
.gitignore. قم بتأكيد.env*.local،.npmrc،.yarnrc، ويتم تجاهل أي ملفات بيانات اعتماد خاصة بالموفر. قم بتشغيلgit ls-filesمن خلال أنماط الموفر الخاص بك للعثور على أي شيء تم الالتزام به بالفعل. - PRE — Scan the built bundle. قم بتشغيل
npm run build، ثم grep.next/staticوأي مخرجاتdist/لنفس الأنماط. إذا وصل المفتاح إلى الحزمة، فلن يكون لدى المطور مطلقًا فصل نظيف عن البيئة. - DEPLOY — Set secrets per environment. Vercel: الإعدادات → متغيرات البيئة، قم بنطاق كل منها إلى Proالإخراج / المعاينة / التطوير. لا تشارك أبدًا
sk_live_*مع بيئة المعاينة. استخدم وحدة تخزين env-var المشفرة Vercel، وليس أسرار سير العمل المضمنة. - DEPLOY — Disable build-log secret echo. بعض تكوينات CI
echoenv vars أثناء الإنشاء. قم بتدقيقvercel.json، أو GitHub سير عمل الإجراءات، أو Cloudflare إعدادات الصفحات لأيecho $SECRETمن شأنها دفع القيمة إلى سجلات البناء العامة. - POST — Run a passive scan. FixVibe تغطي طبقة Free هذا: الصق URL المنشورة، وانتظر ~20 ثانية، وابحث عن نتائج
secrets.*. يقوم التحقق Secrets in JavaScript Bundles بالتقاط المفاتيح التي وصلت إلىlocalStorageأوsessionStorageعبر سوء استخدام SDK. - POST — Rotate any key that ever shipped. إذا كان المفتاح موجودًا في حزمة عامة لمدة دقائق، فاعتبره مخترقًا. قم بتدوير Supabase مفاتيح دور الخدمة عبر لوحة المعلومات، وأعد إنشاء المفاتيح المقيدة Supabase، وقم بإلغاء مفاتيح Anthropic / OpenAI / Google عبر وحدات التحكم الخاصة بهم.
التحكم في الوصول إلى قاعدة البيانات: RLS وقواعد Firestore (6 عناصر)
BaaS الإعدادات الافتراضية مسموحة عن قصد لذا يعمل البرنامج التعليمي الأول. Proيحتاج الإنتاج إلى سياسات واضحة.
- PRE — Enable RLS on every
public.*table. In Supabase: each table needsALTER TABLE ... ENABLE ROW LEVEL SECURITYplus explicit policies for each role. RLS is what stops theanonandauthenticatedAPI roles;FORCE ROW LEVEL SECURITYonly extends it to the table owner and is optional defence in depth. - PRE — Write a policy per (table, role, action). الحد الأدنى: سياسة SELECT التي تنضم إلى
auth.uid(). الأفضل: فصل السياسات INSERT / UPDATE / DELETE بحيث لا يتمكن UPDATE من تهريب التغييراتuser_idالتي تعيد توجيه الملكية. - PRE — Replace default Firebase rules. قراءة قواعد وضع الاختبار الافتراضية
allow read, write: if true;. استبدل القواعد المرتبطة بالمصادقة لكل مجموعة:match /users/{userId}بـallow read, write: if request.auth.uid == userId; - PRE — Lint migrations in CI. قم بتشغيل
supabase db lintأو ما يعادله قبل الدمج. يجب أن يفشل CI في الإنشاء إذا كان أيCREATE TABLE public.*يفتقر إلى سياسة RLS المطابقة. - DEPLOY — Confirm RLS survived deploy. أعد تسجيل الدخول إلى Supabase Studio بعد النشر: الجداول → كل صف → RLS التبديل هو ON. Pro تسبق عمليات ترحيل قاعدة البيانات أحيانًا ملفات السياسة؛ التحقق من أن السياسة حية.
- POST — Run an active scan against a verified domain. يكتب الفحص النشط Supabase Row-Level Security إلى صف أولي صغير باستخدام المفتاح المجهول ويقدم تقريرًا إذا نجحت الكتابة - i.e. RLS لا يتم فرضه فعليًا.
المصادقة والجلسات (7 عناصر)
تميل أخطاء المصادقة في التطبيقات المشفرة AI- إلى أن تكون خفية: التحقق من الرمز المميز، وعلامة HttpOnly المفقودة، وgetSession() حيث يجب أن يكون هناك getUser().
- PRE — Replace
getSession()withgetUser().getSession()يقرأ ملف تعريف الارتباط ويثق به؛getUser()يتم التحقق باستخدام الواجهة الخلفية Supabase. في مسارات الخادم، استخدم دائمًاgetUser(). - PRE — Confirm token expiry. تحتاج الرموز المميزة للارتباط السحري وإعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني إلى انتهاء صلاحية يفرضها الخادم. تنتهي صلاحية الروابط السحرية الافتراضية Supabase بعد ساعة واحدة - لا تتجاوز ذلك إلى رقم أعلى دون سبب حقيقي.
- PRE — Verify JWT
audandexp. إذا قمت بفك تشفير الرموز المميزة يدويًا في أي مكان، فتحقق من كلا المطالبتين. الأفضل: استخدم SDKgetUser()الذي يقوم بذلك نيابةً عنك. - PRE — Audit cookie flags. يجب أن تكون ملفات تعريف الارتباط المخصصة للجلسة
Secure; HttpOnly; SameSite=Lax(أوStrictللتدفقات غير OAuth). لا توجد مادة للجلسة فيlocalStorage. - PRE — Validate the
nextredirect param. يجب أن تبدأ معلمة الاستعلامnextبعد تسجيل الدخول بـ/وليس//(إعادة التوجيه المفتوحة إلى attacker.example). رفض أي شيء آخر من جانب الخادم. - POST — Test logout. قم بتسجيل الدخول، وتسجيل الخروج، وفحص ملفات تعريف الارتباط (DevTools → Application → Cookies). يجب مسح ملف تعريف الارتباط للجلسة على نفس الاستجابة. إذا استمر الأمر، فإن معالج تسجيل الخروج لا يقوم فعليًا بتدمير الحالة من جانب الخادم.
- POST — Active probe. يتحقق Auth Flow Defects وAccount Enumeration من حدود المصادقة المكسورة - استجابات مختلفة حول "المستخدم موجود" مقابل "كلمة مرور خاطئة"، والحد الأقصى للمعدل عند تسجيل الدخول، ورموز إعادة التعيين غير الموقعة.
HTTP رؤوس الأمان وسياسة أمان المحتوى (6 عناصر)
الرؤوس هي أرخص عملية تصلب في المسار بأكمله والأكثر تخطيًا باستمرار من خلال إنشاء الكود.
- PRE — Ship a real CSP. الحد الأدنى:
script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'. لا يوجد'unsafe-inline'فيscript-src. Next.js يطبق الرقم nonce تلقائيًا عندما تقوم البرامج الوسيطة بتعيين رأس الطلبx-nonce. - PRE — Add the legacy three.
X-Content-Type-Options: nosniff،X-Frame-Options: DENY(أو اعتمد على CSPframe-ancestorsوحده)،Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE — Tighten
Referrer-Policy. الافتراضيstrict-origin-when-cross-originمناسب لمعظم التطبيقات. لا تشحنunsafe-urlأو لا تشحن أي رأس على الإطلاق. - PRE — Replace
Access-Control-Allow-Origin: *. جربها. استبدلها بالقائمة المسموح بها للأصل الصريح. في أي مكان يكون فيه*إلى جانبcredentials: include، سيرفض المتصفح الطلب - ولكن هذا ليس دفاعًا ضد الواجهة الخلفية التي تمت تهيئتها بشكل خاطئ. - DEPLOY — Verify headers post-deploy. افتح DevTools ← الشبكة ← انقر على المستند الجذر ← علامة تبويب الرؤوس. CSP، HSTS، يجب أن تكون خيارات X-Frame-Options وX-Content-Type-Options موجودة. CSP يجب ألا يكون لديه
'unsafe-inline'فيscript-src. - POST — Run HTTP Security Headers. يقوم فحص الرأس الخامل بالإبلاغ عن كل رأس مفقود مع إرشادات إصلاح النظام الأساسي للنشر (Vercel
vercel.json، Cloudflare الصفحات_headers، Netlify_headers، Next.js البرامج الوسيطة).
عمليات تكامل الجهات الخارجية وAPIs (5 عناصر)
كل نص تقوم بتضمينه هو استثناء CSP وسطح محتمل لسلسلة التوريد. تعامل مع الأطراف الثالثة كجزء من حدود الثقة الخاصة بك.
- PRE — Reverse-proxy analytics where possible. PostHog، معقول، تدعم جميع Umami التفويض من خلال المجال الخاص بك (e.g.
/api/posthog). يؤدي هذا إلى إبقاءconnect-srcعلى نفس الأصل ويتغلب على أدوات حظر الإعلانات. - PRE — CSP-allowlist the rest. بالنسبة إلى Google Analytics، Stripe.js، وSentry، وIntercom، وGTM، وما إلى ذلك، أضف أصول كل بائع إلى التوجيه المطابق CSP (
script-srcللتحميل،connect-srcللقياس عن بعد،frame-srcلإطارات iframe،img-srcللبكسل). - PRE — Use Stripe Checkout, not raw card forms. Stripe Checkout عبارة عن عملية إعادة توجيه عالية المستوى؛ لا يلزم إدخال CSP للبرنامج النصي. السطح المستضاف PCI موجود بالكامل في نطاق Stripe. لفة بنفسك فقط إذا كان لديك سبب قوي.
- PRE — Lock
package-lock.jsonin CI. قم بتشغيلnpm ci(وليسnpm install) في بنيات الإنتاج. قم بتدقيق التبعيات باستخدامnpm auditأو Snyk قبل كل إصدار. - POST — Watch Technology Fingerprinting. يظهر اكتشاف مكدس التكنولوجيا السلبي إصدارات المكتبة المرئية للزاحف. إذا قمت بإرسال EOL React أو jQuery أو Bootstrap، فإن FixVibe تضع علامة عليها وتربطها بـ CVEs المعروفة.
نظافة النشر والبنية التحتية (8 عناصر)
إن كيفية النشر مهمة بقدر أهمية ما تنشره. AI- تستفيد التطبيقات المشفرة بشكل خاص من تقوية النشر الصريحة.
- PRE — Disable
x-powered-by. فيnext.config.js:poweredByHeader: false. يزيل إشارة الكشف عن النسخة المجانية. - PRE — Confirm middleware lives at
src/middleware.ts. باستخدام تخطيط الدليلsrc/، يتجاهل Next.js مستوى الجذرmiddleware.ts. تفشل البرامج الوسيطة في غير مكانها بصمت في تعيين CSP / رؤوس المصادقة / حدود المعدل. - PRE — Sanity-check Vercel deployment protection. Pro يجب أن يكون الاستقراء عامًا؛ يجب أن تكون المعاينة محمية بكلمة مرور أو تقتصر على أعضاء المؤسسة. Vercel-Specific Exposure يُبلغ عن السطح.
- PRE — Block dotfile and config probes at the edge. أضف قاعدة إعادة كتابة أو رفض لأنماط
/.env،/.git/*،/.aws/*،/.next/trace. Vercel يُرجع 403 للعديد من هذه العناصر بشكل افتراضي؛ شيك مسطر. - DEPLOY — Separate environments. Proالإخراج والمعاينة والتطوير. كل منهم يحصل على مجموعة من الأسرار الخاصة به. لا تصل المفاتيح المباشرة إلى المعاينة مطلقًا، ولا يصل وضع الاختبار Stripe أبدًا إلى Proالإنتاج.
- DEPLOY — Enable Vercel Web Application Firewall. Pro وخطط Enterprise تتضمن WAF مع القواعد المُدارة. Cloudflare يحتوي Pages على وضع Bot Fight. يعمل كلاهما على تقليل إساءة استخدام الماسح الضوئي الآلي وتحميل رش كلمة المرور.
- POST — Verify TLS configuration. SSL Labs أو testssl.sh مقابل مجال الإنتاج الخاص بك. TLS 1.2 كحد أدنى، يفضل TLS 1.3، لا توجد شفرات ضعيفة، HSTS مؤهل للتحميل المسبق.
- POST — Confirm health-check endpoints are minimal. يجب أن يعود
/api/health200 OKبدون أي نص. لا تقم بتكرار البيئة أو إنشاء التجزئة أو نشر الطابع الزمني بدون مصادقة.
المراقبة المستمرة وإعادة المسح (4 عناصر)
الأمان ليس عملية تدقيق لمرة واحدة قبل الشحن. يحدث الانجراف عند كل عملية نشر.
- Verify your production domain in FixVibe. Dashboard → Domains → DNS TXT or HTTP file verification. Active scans require Hobby or above, scheduled scans require Pro or Unlimited, and live threat monitoring requires Unlimited.
- Schedule passive re-scans on Pro or Unlimited. Choose an available cadence for your verified domain. Scheduled runs share your scan allowance; enable completion notifications and signed webhooks as needed. A scheduled scan observes the app at run time, not continuously.
- Wire outbound webhooks. Account → Webhooks → أضف نقطة نهاية HTTPS، واشترك في
scan.completed+finding.created+scan.active_api.first_used. الطريق إلى Slack / Discord / PagerDuty. - Enable live threat monitoring on Unlimited. Periodic certificate, DNS, bundle, and threat-intelligence checks can surface changes between scheduled scans. Coverage and alert timing depend on the signal and successful polling.
Replit Agent
If you build with Replit Agent, also check:
- Don't paste keys into the Agent prompt. Add them in Secrets and give the Agent the variable name instead, so the value never appears in generated code or chat history.
- Test CORS on the production domain. The preview pane and your deployed URL are different origins. Check your CORS allowlist against the domain users actually load.
- Replit Agent sometimes hardcodes test values. قد يقوم الوكيل بإنشاء تعليمات برمجية باستخدام
API_URL = 'http://localhost:5000</code>. قبل الشحن، استبدله بـ <code>os.environ[API_URL'].
Firebase Studio
If you build with Firebase Studio, also check:
- Test-mode rules are temporary by intent, not by default. Test mode lets anyone read and overwrite data. If the generated rule carries a date cutoff, client access stops on that date; if not, the database stays open. Replace test rules before launch either way.
- Security rules protect data, not Hosting. Firestore and Storage rules don't govern what Firebase Hosting serves: everything in the public directory is public. Keep exports, backups and admin pages out of it.
Claude Code
If you build with Claude Code, also check:
- PRE — Keep personal Claude Code settings out of git. Commit
.claude/settings.jsonfor shared project settings, but keep.claude/settings.local.jsonout of the repo: Claude Code excludes it from git when it creates the file, so check it if you created it by hand. Session history lives in~/.claude, outside the project (Claude Code docs). - Bash operations are unverified. Claude Code ينفذ أوامر bash مباشرة. يعد
git commit -m "fix"أمرًا ملائمًا، ولكن إذا كان دليل العمل يحتوي على ملف.envويتضمنه الكرة الأرضية، فإنه يلتزم. قم دائمًا بمراجعةgit diff --cachedقبل تنفيذ Claude Code.
الخطوات التالية
هل تريد الخلفية التعليمية حول سبب أهمية هذه العناصر؟ اقرأ AI-generated code security scanning. هل تريد مقتطفات برمجية محددة لكل خطوة تقوية؟ راجع How to secure an app built with AI coding tools.
