// docs / baas security / firebase if-true explainer
Firebase allow read, write: if true مشروحًا: ما يفعله وكيفية إصلاحه
<code>allow read, write: if true;</code> هو التهيئة الخاطئة الأكثر شيوعًا لـ Firebase في الإنتاج. إنه افتراضي الوضع التجريبي الذي تقترحه وحدة تحكم Firebase عند إنشاء قاعدة بيانات جديدة، والقاعدة التي تُعيد أدوات البرمجة بالذكاء الاصطناعي توليدها من التوثيق، والقاعدة التي تفتح قاعدة بيانات Firestore بأكملها لأي شخص على الإنترنت. يشرح هذا المقال البنية بدقة، ويُظهر ما يراه المهاجم عندما تكون هذه القاعدة حية، ويُعطيك أربعة بدائل أكثر صرامة بشكل تدريجي تناسب حالات استخدام مختلفة.
البنية، سطرًا بسطر
وثيقة قواعد كاملة للوضع التجريبي لـ Firestore هي ستة أسطر:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}مفكوكة:
rules_version = '2';يختار محرك القواعد v2 (الحالي). قواعد v1 الأقدم مهجورة.service cloud.firestoreيحصر الكتلة على Firestore. Realtime Database يستخدم بنية مختلفة قائمة على JSON؛ Cloud Storage يستخدمservice firebase.storage.match /databases/{database}/documentsيربط قاعدة البيانات الخاصة(default)(معظم المشاريع تحتوي على واحدة فقط).match /{document=**}هي بطاقة برية متكررة.**تطابق أي مسار بأي عمق. مدمجة مع{document}، تلتقط كل وثيقة في كل مجموعة — جملة مطابقة واحدة تحكم قاعدة البيانات بأكملها.allow read, write: if true;هو نص القاعدة. يُسمح بكل منreadوwrite؛ الشرطif trueهو، حسنًا، صحيح دائمًا.readيُغطي عمليتيgetوlist؛writeيُغطيcreateوupdateوdelete.
الأثر الصافي: أي عميل يحمل معرِّف مشروع Firebase وSDK المناسب يمكنه قراءة أو كتابة أي وثيقة في أي مجموعة. المصادقة غير مطلوبة. حدود المعدل غير مفروضة.
لماذا يُصدِر Firebase هذا كافتراضي
يريد Firebase أن تكون مبرمجًا خلال أول 30 ثانية بعد إنشاء مشروع. البديل — إجبارك على كتابة قاعدة صحيحة قبل أن تعمل أي قراءة أو كتابة — سيُعيق التهيئة الأولية. لذا تقدم وحدة التحكم خيارين عند إنشاء قاعدة بيانات: Production mode (رفض كل شيء، أنت تكتب القواعد) أو Test mode (السماح بكل شيء لمدة 30 يومًا). معظم المطورين ينقرون على الوضع التجريبي، ثم ينسون العودة. كانت المشاريع القديمة بمؤقت 30 يومًا؛ المشاريع الحالية بقاعدة if true غير محدودة دون انتهاء صلاحية تلقائي.
المشكلة البنيوية: تتدرب أدوات البرمجة بالذكاء الاصطناعي على التوثيق والدروس وإجابات Stack Overflow التي تُظهر قواعد الوضع التجريبي. عندما تسأل Cursor أو Claude Code "كيف أُعدّ Firebase"، تشمل الإجابة كثيرًا كتلة allow read, write: if true الدقيقة كأنها قاعدة الإنتاج. لا يعرف الذكاء الاصطناعي — ولا يتم تنبيهه ليعرف — أن هذه القاعدة غير آمنة للإنتاج.
ما يراه المهاجم
بشكل ملموس، يمكن لمهاجم يعرف معرِّف مشروع Firebase الخاص بك (قابل للاستخراج من أي حزمة تطبيق منشور خلال 30 ثانية) ويُشغِّل ما يلي سرد كل وثيقة في كل مجموعة:
طلب curl واحد غير مُصادق كافٍ لتعداد كل مجموعة. راجع الكتلة المُميَّزة أدناه.
curl 'https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents:listCollectionIds' \
-X POST \
-H 'Content-Type: application/json' \
-d '{}'الاستجابة هي القائمة الكاملة للمجموعات من المستوى الأعلى. لكل مجموعة، يُعيد طلب ثانٍ الوثائق. لا يوجد حد للمعدل على هذا المسار لأن قواعد if true تقبل حركة المرور المجهولة. لقد رأينا قواعد بيانات Firebase تحتوي على ملايين الوثائق تم تعدادها في أقل من ساعة.
في مسار الكتابة: POST واحد مع {fields} يُنشئ وثيقة جديدة. يمكن للمهاجمين تلويث مجموعاتك بقمامة، أو تشويه الصفحات الموجهة للمستخدم التي تقرأ من Firestore، أو استخدام قاعدة بياناتك كوسيط رسائل مجاني — ترتفع فاتورة استخدامك، وتحقق، وتشرح الفاتورة المشكلة.
أربعة بدائل آمنة للإنتاج
اختر البديل الذي يطابق نموذج بيانات تطبيقك. الأربعة جميعًا تفترض أن لديك مصادقة مستخدم (Firebase Auth أو أي موفِّر يُصدر رمز معرِّف Firebase):
الخيار 1: وثائق مملوكة للمستخدم
النمط الأكثر شيوعًا لـ SaaS. تعيش الوثائق تحت /users/{userId}/... وفقط المالك يمكنه لمسها. match /users/{userId}/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /users/{userId}/{document=**} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}الخيار 2: حقل مالك على كل وثيقة
عندما تعيش الوثائق في مجموعات مسطحة (لا متداخلة تحت معرِّف المستخدم)، خزِّن حقل owner_uid وتحقق منه. match /posts/{postId} { allow read: if resource.data.public == true || resource.data.owner_uid == request.auth.uid; allow write: if request.auth.uid == resource.data.owner_uid; }
match /posts/{postId} {
allow read: if resource.data.public == true
|| resource.data.owner_uid == request.auth.uid;
allow write: if request.auth.uid == resource.data.owner_uid;
}الخيار 3: عزل المؤسسات متعددة المستأجرين
لـ B2B SaaS ببيانات محصورة بالمؤسسة. خزِّن حقل org_id على كل وثيقة وتحقق منه مقابل ادعاء مخصص للمستخدم. allow read, write: if request.auth.token.org_id == resource.data.org_id;. يتطلب تعيين الادعاء المخصص أثناء التسجيل عبر Firebase Admin SDK.
allow read, write: if request.auth.token.org_id == resource.data.org_id;
الخيار 4: محتوى عام للقراءة فقط
للمحتوى التسويقي، والملفات الشخصية العامة، وكتالوجات المنتجات — أي شيء قابل للقراءة عام حقًا ولكن قابل للكتابة من المسؤول فقط. match /products/{productId} { allow read: if true; allow write: if request.auth.token.admin == true; }. يُعيَّن الادعاء المخصص admin على حسابات المسؤولين فقط.
match /products/{productId} {
allow read: if true;
allow write: if request.auth.token.admin == true;
}استعلام مراجعة سريع
قبل الإصلاح، تحقق مما إذا كانت if true حية فعلًا. افتح وحدة تحكم Firebase → Firestore → Rules وابحث عن if true. إذا وجدتها في أي مكان خارج تعليق، فلديك نتيجة قاعدة مفتوحة. يتيح لك محاكي القواعد في نفس الواجهة إعادة تشغيل طلب المهاجم محليًا — الصق GET /users/somebody مجهول وأكِّد أن المحاكي يُعيد Allowed.
تأكيد خارجي: شغِّل مسح FixVibe على عنوان URL الإنتاج. فحص baas.firebase-rules يستكشف قواعد Firestore وRealtime Database وStorage الخاصة بك ويُبلِّغ عن نفس النتيجة التي قد يكتشفها المهاجم — مستقلًا عما تُظهره وحدة تحكم Firebase.
الأسئلة الشائعة
ما الفرق بين <code>if true</code> و<code>if request.auth != null</code>؟
if true يسمح بالوصول المجهول — أي شخص على الإنترنت. if request.auth != null يتطلب أي مستخدم مُسجَّل، وهو أفضل ولكنه لا يزال خاطئًا: أي مستخدم لتطبيقك يمكنه قراءة بيانات كل مستخدم آخر. يجب أن تُحصر قواعد الإنتاج بالمستخدم المحدد أو المؤسسة عبر request.auth.uid == resource.data.owner_uid أو ما شابه.
هل ينتهي Firebase تلقائيًا صلاحية قواعد <code>if true</code>؟
المشاريع القديمة (قبل 2023) كان لها مؤقت 30 يومًا يُحوِّل قواعد if true إلى if false. المشاريع الحالية لا تفعل ذلك — تستمر القاعدة إلى أجل غير محدود حتى يتم استبدالها يدويًا. إذا أنشأت مشروعك قبل 2023 وتبدو قواعدك جيدة، تحقق مرتين: قد يكون المؤقت قد قلبها بالفعل إلى if false، مما يحجب تطبيقك الخاص.
هل يمكنني استخدام فحص طابع زمني بتاريخ مستقبلي كشبكة أمان؟
لا — شرط الطابع الزمني ليس ضابط أمان. ينتهي صلاحية القاعدة المفتوحة في تاريخ مستقبلي، مما يعني أنه حتى ذلك التاريخ يملك المهاجمون وصولًا كاملاً. وستنسى التاريخ. استبدل if true بقاعدة محصورة بالمصادقة، لا بقاعدة محدودة بالوقت.
ماذا لو كان تطبيقي قابلًا للقراءة العامة حقًا (مدونة، كتالوج منتجات)؟
إذن اكتب صراحة allow read: if true; allow write: if false; على المجموعة العامة فقط — وليس على كل مجموعة في قاعدة بياناتك. استخدم جملة match منفصلة لكل مجموعة ولا تستخدم أبدًا البطاقة البرية المتكررة {document=**} على قواعد قابلة للكتابة.
الخطوات التالية
شغِّل مسح FixVibe على عنوان URL الإنتاج — يُؤكِّد فحص baas.firebase-rules ما إذا كانت if true قابلة للاستغلال حاليًا من الإنترنت العام. لآليات الماسح والاكتشافات الموازية لـ Realtime Database وStorage، راجع ماسح قواعد Firebase. لفئة التهيئة الخاطئة المكافئة على Supabase، اقرأ ماسح Supabase RLS.
