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

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