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

استخدِم هذا الدليل للتعرّف على الثغرات الشائعة في إعدادات 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 Functions الوصول إلى بيانات حسابك قاعدة البيانات. استخدِم هذه القواعد عندما تريد استخدام 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.