إصلاح القواعد غير الآمنة

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

إذا تلقّيت تنبيهًا يشير إلى أنّ قاعدة بيانات Cloud Firestore غير مؤمَّنة بشكل صحيح، يمكنك حلّ الثغرات الأمنية عن طريق تعديل Cloud Firestore Security Rules واختبارها.

لعرض "قواعد الأمان" الحالية، انتقِل إلى علامة التبويب "القواعد في وحدة تحكُّم Firebase.

التعرّف على Cloud Firestore Security Rules

Cloud Firestore Security Rules تحمي بياناتك من المستخدمين الضارين. ترفض القواعد التلقائية لأي مثيل تم إنشاؤه في Firebase console وصول جميع المستخدمين.Cloud Firestore لتطوير تطبيقك والوصول إلى قاعدة البيانات، عليك تعديل هذه القواعد وقد تحتاج إلى منح إذن وصول شامل لجميع المستخدمين في بيئة التطوير. ومع ذلك، قبل نشر تطبيقك في بيئة التشغيل الفعلي، خذ وقتك لإعداد قواعدك بشكل صحيح وتأمين بياناتك.

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

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

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

إتاحة إمكانية الوصول المفتوح

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

لا يُنصح بما يلي: إتاحة إذن القراءة والكتابة لجميع المستخدمين.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
الحلّ: قواعد تقيّد إذن القراءة و الكتابة.

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

مالك المحتوى فقط

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      // Allow reads and deletion if the current user owns the existing document
      allow read, delete: if request.auth.uid == resource.data.author_uid;
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;

    }
  }
}
  

إتاحة إذن الوصول العام والخاص معًا

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      // Allow public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}
  

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

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

لا يُنصح بما يلي: إتاحة إذن القراءة والكتابة لأي مستخدم مسجّل الدخول في قاعدة البيانات بأكملها.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
الحلّ: تضييق نطاق إذن الوصول باستخدام شروط الأمان.

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

وصول على أساس الدور

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

وصول على أساس السمة

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

إتاحة إذن الوصول العام والخاص معًا

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

إتاحة إذن الوصول لعناوين البريد الإلكتروني التي لم يتم إثبات ملكيتها

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

لا يُنصح بما يلي: يمكن لأي مستخدم تسجيل الدخول باستخدام عنوان بريد إلكتروني عشوائي.
service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email.endsWith('@example.com')
    }
  }
}
الحلّ: تضييق نطاق إذن الوصول إلى عناوين البريد الإلكتروني التي تم إثبات ملكيتها فقط.

إثبات ملكية عناوين البريد الإلكتروني

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email_verified
                 && request.auth.email.endsWith('@example.com')
    }
  }
}

إتاحة إذن الوصول الخاص

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

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

لا يزال بإمكان حِزم Firebase Admin SDK ووظائف السحابة الإلكترونية الوصول إلى قاعدة البيانات. استخدِم هذه القواعد عندما تنوي استخدام Cloud Firestore كواجهة خلفية للخادم فقط بالتزامن مع حزمة Firebase Admin SDK. على الرغم من أنّها آمنة، عليك اختبار ما إذا كان بإمكان عملاء تطبيقك استرداد البيانات بشكل صحيح.

مزيد من المعلومات عن Cloud Firestore Security Rules وكيفية عملها في البدء باستخدام Cloud Firestore Security Rules.

التحقّق من Cloud Firestore Security Rules

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

لاختبار Cloud Firestore Security Rules المعدَّلة في وحدة تحكُّم Firebase بسرعة، استخدِم أداة Rules Playground.

  1. لفتح Rules Playground، انقر على Rules playground من علامة التبويب "القواعد".
  2. في إعدادات Rules playground، اختَر خيارات الاختبار، بما في ذلك:
    • اختبار عمليات القراءة أو الكتابة
    • موقع معيّن في قاعدة البيانات، كمسار
    • نوع المصادقة: مستخدم غير مصادق عليه أو مستخدم مجهول الهوية تمت مصادقته أو رقم تعريف مستخدم معيّن
    • بيانات خاصة بالمستند تشير إليها قواعدك تحديدًا (على سبيل المثال، إذا كانت قواعدك تتطلّب توفّر حقل معيّن قبل السماح بعملية كتابة)
  3. انقر على تشغيل وابحث عن النتائج في الشعار أعلى نافذة القواعد.