// docs / baas security / firebase rules scanner
ماسح قواعد Firebase: ابحث عن قواعد Firestore وRealtime Database وStorage المفتوحة
تطبيقات Firebase تفشل أمنيًا بطريقة واحدة متسقة: قواعد <code>allow read, write: if true;</code> المتبقية من البدء السريع في الوضع التجريبي، ولم يتم استبدالها قبل الإنتاج. تُولِّد أدوات البرمجة بالذكاء الاصطناعي هذه القواعد حرفيًا من أمثلة التوثيق ونادرًا ما تنبه المطور لتحصينها. يوضح هذا المقال كيف يكتشف ماسح قواعد Firebase القواعد المفتوحة عبر Firestore وRealtime Database وCloud Storage من خارج المشروع — وكيفية إصلاح ما يجده.
كيف يجد الماسح قواعد Firebase المفتوحة
تكشف خدمات Firebase أشكال URL معروفة وقابلة للتنبؤ. ماسح بدون بيانات اعتماد يمكنه استكشاف كل واحدة منها ومراقبة ما إذا كانت القراءات المجهولة تنجح. يعمل فحص baas.firebase-rules في FixVibe في ثلاثة فحوص مستقلة — واحد لكل خدمة Firebase:
- <strong>Firestore.</strong> The scanner extracts the project ID from the deployed app's bundle (it's in <code>firebase.initializeApp({ projectId: ... })</code>), then issues <code>GET https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents/[collection]:listDocuments</code> against common collection names. A <code>200 OK</code> with documents in the response means <code>allow read</code> is permissive.
- Realtime Database. يستكشف الماسح
https://[project-id]-default-rtdb.firebaseio.com/.json. إذا كان الجذر قابلًا للقراءة بشكل مجهول، فالاستجابة هي شجرة قاعدة البيانات بكاملها كـ JSON. اختبار أكثر تحفظًا يستعلم.json?shallow=true، الذي يُرجع المفاتيح من المستوى الأعلى فقط — نتيجة في كلتا الحالتين. - Cloud Storage. يستعلم الماسح
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. إذا كانت الاستجابة تسرد أسماء الملفات دون مصادقة، فالدلو قابل للسرد المجهول. التخزين القابل للسرد نتيجة حتى عندما تُرفض تنزيلات الملفات الفردية — يُعدِّد المهاجمون الدلو للعثور على أسماء ملفات يمكن تخمينها.
كيف يبدو فعليًا فخ الوضع التجريبي
تتضمن وثائق البدء السريع لـ Firebase واحدة من أكثر كتل القواعد نسخًا على الإنترنت:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}كان Firebase يُضيف انتهاء صلاحية تلقائي لمدة 30 يومًا على هذه القواعد. تغيَّر ذلك: اليوم تستمر القواعد إلى الأبد ما لم يستبدلها المطور. أدوات البرمجة بالذكاء الاصطناعي — المُدرَّبة على سنوات من التوثيق الذي يتضمن كتلة الوضع التجريبي — تُصدرها كثيرًا حرفيًا وتُخبر المطور "هذه قاعدة الأمان الخاصة بك". إنها ليست كذلك.
متغيرات أخرى تظهر في الإنتاج ولكنها متساهلة بنفس القدر:
// future-date variant — equivalent to "if true" allow read, write: if request.time < timestamp.date(2099, 1, 1); // authenticated-user variant — any signed-in user reads and writes anything allow read: if true; allow write: if request.auth != null; // any-auth variant — any signed-in user owns every document allow read, write: if request.auth != null;
- متغير طابع زمني مستقبلي: قاعدة تسمح بكل شيء حتى تاريخ بعيد في المستقبل. لا تنتهي صلاحيتها فعليًا أبدًا (راجع الكتلة المُميَّزة أعلاه).
allow read: if true; allow write: if request.auth != null;— قراءات عامة، يمكن لأي مستخدم مُصادق الكتابة.allow read, write: if request.auth != null;— يمكن لأي مستخدم مُسجَّل قراءة أو كتابة أي وثيقة، بما في ذلك بيانات المستخدمين الآخرين.
ماذا تفعل عندما يجد الماسح قاعدة مفتوحة
قواعد Firebase المفتوحة طارئة في وقت التشغيل. الإصلاح بنفس الشكل عبر الخدمات الثلاث: حصر كل قاعدة بـ request.auth.uid على حقل مالك صريح. لكل خدمة بنية قواعد خاصة بها:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. ربط جزء المسار {userId} يصبح الوثيقة الوحيدة التي يمكن للمستخدم لمسها.
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}Realtime Database
<code>{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }</code>. The <code>$uid</code> wildcard captures the path segment for comparison.
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}Cloud Storage
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. الاصطلاح: تخزين الملفات تحت users/[uid]/[filename] وترك المسار يفرض الملكية.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}انشر القواعد عبر Firebase CLI: firebase deploy --only firestore:rules وfirebase deploy --only database وfirebase deploy --only storage. تحقق من أن القواعد الجديدة في الإنتاج بإعادة تشغيل مسح FixVibe — يجب أن تختفي نتيجة baas.firebase-rules.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageكيف تُقارَن هذه الأداة بأدوات Firebase المدمجة
تُظهر لك وحدة تحكم Firebase القواعد الحالية ولكنها لا تراجعها مقابل سلوك وقت التشغيل. يتيح لك محاكي قواعد Firebase اختبار منطق القاعدة مقابل طلبات اصطناعية — مفيد ولكن محلي. لا تخبرك أي أداة بما تُعيده قواعد الإنتاج فعلًا لمهاجم مجهول على الإنترنت العام. ماسح خارجي مثل FixVibe (أو Burp Suite مع تكوين يدوي) هو الشيء الوحيد الذي يستكشف من نفس الزاوية التي قد يفعلها مهاجم. App Check الخاص بـ Google يُخفِّف من سوء الاستخدام ولكنه لا يحل محل القواعد المحصورة بشكل صحيح.
الأسئلة الشائعة
هل يقرأ الماسح بيانات Firestore الخاصة بي أو يُعدِّلها؟
تُصدر عمليات المسح السلبية ما لا يزيد عن قراءة مجهولة واحدة لكل خدمة لتأكيد ما إذا كانت القواعد تسمح بها. يُسجِّل الماسح شكل الاستجابة ووجود البيانات — لا يُقسِّمها على صفحات، ولا يُعدِّد الوثائق، ولا يكتب. فحوصات الكتابة مشروطة بالتحقق من ملكية النطاق ولا تُشغَّل أبدًا على أهداف غير مُتحقَّق منها.
ماذا لو كان مشروع Firebase الخاص بي يستخدم App Check؟
يرفض App Check الطلبات غير المُصادقة بـ 403. ماسح بدون رمز App Check سيرى 403 في كل فحص — وهذه هي النتيجة الصحيحة. App Check ليس بديلًا عن صحة القواعد (رمز App Check مسروق بالإضافة إلى قاعدة مفتوحة لا يزال يُسرِّب البيانات)، ولكنه يحجب عمليات المسح الخارجية الانتهازية.
هل يمكن للماسح اكتشاف التهيئات الخاطئة الجزئية للقواعد (القراءة مفتوحة، الكتابة مغلقة)؟
نعم — يتم استكشاف كل قاعدة (allow read، allow write) بشكل منفصل. فحص قراءة فقط ينجح بـ 200 OK يُبلِّغ عن نتيجة قراءة مفتوحة حتى لو كانت الكتابات مرفوضة. النتيجتان متميزتان: تسريب البيانات والتلاعب بالبيانات مخاطر منفصلة.
هل يعمل هذا لتطبيقات Firebase المنشورة تحت نطاق مخصص؟
نعم. يستخرج الماسح معرِّف مشروع Firebase من الحزمة المنشورة، لا من النطاق. النطاقات المخصصة، ونطاقات app.web.app الفرعية، وتطبيقات Firebase المُستضافة ذاتيًا، جميعها تعمل بنفس الطريقة طالما أن حزمة JavaScript قابلة للوصول.
الخطوات التالية
شغِّل مسح FixVibe مجاني على عنوان URL الإنتاج — يأتي فحص baas.firebase-rules مع كل خطة ويُؤشِّر القواعد المفتوحة عبر Firestore وRealtime Database وCloud Storage. لشرح أعمق حول نمط allow read, write: if true تحديدًا، راجع Firebase allow read, write: if true مشروحًا. للحصول على رؤية شاملة عبر Supabase وFirebase وClerk وAuth0، اقرأ ماسح التهيئة الخاطئة لـ BaaS.
