تجنُّب القواعد غير الآمنة

استخدِم هذا الدليل للتعرّف على الثغرات الشائعة في إعدادات Firebase Security Rules ومراجعة قواعدك وتأمينها بشكلٍ أفضل، واختبار التغييرات قبل نشرها.

إذا تلقّيت تنبيهًا يفيد بأنّ بياناتك غير آمنة بشكلٍ صحيح، راجِع هذه الأخطاء الشائعة وعدِّل أي قواعد معرّضة للاختراق.

الوصول إلى Firebase Security Rules

للاطّلاع على Rules الحالية، استخدِم إما واجهة سطر أوامر Firebase أو وحدة تحكّم Firebase. احرص على تعديل قواعدك باستخدام الطريقة نفسها باستمرار لتجنّب استبدال التحديثات عن طريق الخطأ. إذا لم تكن متأكّدًا مما إذا كانت القواعد المحدّدة محليًا تعكس آخر التعديلات، تعرض وحدة التحكّم في Firebase دائمًا أحدث إصدار تم نشره من Firebase Security Rules.

للوصول إلى قواعدك من وحدة تحكّم Firebase، اختَر مشروعك، ثم انتقِل إلى Realtime Database أو Cloud Firestore أو مساحة التخزين. انقر على القواعد بعد الانتقال إلى قاعدة البيانات أو حزمة التخزين المناسبة.

للوصول إلى قواعدك من Firebase CLI، انتقِل إلىملف القواعد المُشار إليه في ملف firebase.json.

فهم Firebase Security Rules

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

أثناء تطوير تطبيقك واختبار إعدادات مختلفة لقواعدك، استخدِم أحد محاكيات Firebase المحلية لتشغيل تطبيقك في بيئة تطوير محلية.

السيناريوهات الشائعة مع القواعد غير الآمنة

يجب مراجعة وتحديث Rules الذي قد أعددته تلقائيًا أو كما كنت تعمل في البداية على تطوير تطبيقك قبل نشر التطبيق. تأكَّد من تأمين بيانات المستخدمين بشكل مناسب من خلال تجنُّب المشاكل الشائعة التالية.

الوصول المفتوح

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

غير مستحسن: إذن بالقراءة والكتابة لجميع المستخدمين

Cloud Firestore

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Realtime Database

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

  "rules": {
    ".read": true,
    ".write": true
  }
}
    

Cloud Storage

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
الحل:القواعد التي تقيد الوصول للقراءة والكتابة.

أنشئ قواعد منطقية للتسلسل الهرمي لبياناتك. أحد الحلول الشائعة لمواجهة انعدام الأمان هو الأمان المستند إلى المستخدم من خلال Firebase Authentication. مزيد من المعلومات عن مصادقة المستخدمين باستخدام القواعد

Cloud Firestore

Realtime Database

Cloud Storage

إمكانية الوصول لأي مستخدم تمّت مصادقته

في بعض الأحيان، تتحقّق ميزة Rules من أنّ المستخدم قد سجّل الدخول، ولكن لا تحدّ من إمكانية وصوله استنادًا إلى تلك المصادقة. إذا كانت إحدى قواعدك تتضمّن auth != null، تأكَّد من أنّك تريد أن يتمكّن أي مستخدم سجّل الدخول من الوصول إلى البيانات.

غير مستحسن: يحصل أي مستخدم سجّل الدخول على إذن بالقراءة والكتابة في قاعدة بياناتك بالكامل.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
الحلّ: يمكنك تضييق نطاق الوصول باستخدام شروط الأمان.

عند التحقّق من المصادقة، قد تحتاج أيضًا إلى استخدام إحدى سمات المصادقة لفرض مزيد من القيود على الوصول إلى مستخدمين معيّنين لمجموعات بيانات معيّنة. مزيد من المعلومات حول سمات المصادقة المختلفة

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) القواعد المكتسَبة بشكل غير صحيح

Realtime Database Security Rules التسلسل، مع إلغاء القواعد في مسارات العناصر الرئيسية الأقل عمقًا للقواعد في العقد الفرعية الأكثر عمقًا عند كتابة قاعدة في عقدة فرعية، تذكَّر أنّه لا يمكنها منح سوى امتيازات إضافية. لا يمكنك تحسين الوصول إلى البيانات أو إبطاله في مسار أعمق في قاعدة البيانات الخاصة بك.

غير مقترَح: تحسين القواعد في مسارات الصفحات الفرعية
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
الحلّ: اكتب قواعد في مسارات العناصر الرئيسية تكون واسعة النطاق، وامنح امتيازات أكثر تحديدًا في مسارات العناصر الفرعية إذا كانت احتياجات الوصول إلى البيانات تتطلّب مزيدًا من الدقة، حافظ على دقة قواعدك. يمكنك معرفة المزيد عن التتالي Realtime Database Security Rules في البنية الأساسية لـ Realtime Database Security Rules.

الوصول المغلق

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

Cloud Firestore

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
    

Cloud Storage

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

سيظل بإمكان حِزم تطوير البرامج (SDK) الخاصة بمشرفي Firebase و"وظائف السحابة الإلكترونية" الوصول إلى قاعدة بياناتك. استخدِم هذه القواعد عندما تريد استخدام Cloud Firestore أو Realtime Database كخلفية للخوادم فقط مع "حزمة تطوير البرامج (SDK) لمسؤولي Firebase". ومع كونه آمنًا، يجب عليك اختبار ما إذا كان يمكن لعملاء تطبيقك استرداد البيانات بشكل صحيح.

اطّلِع على مزيد من المعلومات حول Cloud Firestore Security Rules وطريقة عملها في مقالة البدء في استخدام Cloud Firestore Security Rules.

اختبار Cloud Firestore Security Rules

للتحقق من سلوك تطبيقك والتحقّق من إعدادات Cloud Firestore Security Rules، استخدِم محاكي Firebase. استخدِم محاكي Cloud Firestore لإجراء اختبارات الوحدات وبرمجتها في بيئة محلية قبل نشر أي تغييرات.

للتحقّق بسرعة من Firebase Security Rules في وحدة تحكّم Firebase، استخدِم محاكي قواعد Firebase.