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

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

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

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

فهم Cloud Firestore Security Rules

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

أثناء تطوير تطبيقك واختبار إعدادات مختلفة ل القواعد، استخدِم محاكي 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;
    }
  }
}

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

اطّلِع على مزيد من المعلومات حول 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. لفتح "مساحة اختبار القواعد"، انقر على مساحة اختبار القواعد من علامة التبويب "القواعد".
  2. في إعدادات Rules playground (مساحة اختبار القواعد)، اختَر خيارات لاختبارك، بما في ذلك:
    • اختبار عمليات القراءة أو الكتابة
    • موقع جغرافي محدّد في قاعدة بياناتك، كمسار
    • نوع المصادقة: مستخدم مجهول غير مصادقة أو مصادقة أو معرّف مستخدم محدّد
    • البيانات الخاصة بالمستندات التي تشير إليها قواعدك على وجه التحديد (مثل إذا كانت قواعدك تتطلّب توفُّر حقل معيّن قبل permitting a write)
  3. انقر على تشغيل وابحث عن النتائج في البانر أعلى نافذة القواعد.