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

استخدم هذا الدليل لفهم الثغرات الأمنية الشائعة في تكوينات قواعد أمان Firebase ، ومراجعة القواعد الخاصة بك وتأمينها بشكل أفضل ، واختبار التغييرات قبل نشرها.

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

الوصول إلى قواعد أمان Firebase

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

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

للوصول إلى القواعد الخاصة بك من Firebase CLI ، انتقل إلى ملف القواعد المدون في ملف firebase.json .

افهم قواعد أمان Firebase

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

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

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

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

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

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

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

سحابة 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;
    }
  }
}

قاعدة بيانات الوقت الحقيقي

{
  // 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
  }
}
    

سحابة التخزين

// 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. تعرف على المزيد حول مصادقة المستخدمين بالقواعد .

سحابة Firestore

قاعدة بيانات الوقت الحقيقي

سحابة التخزين

الوصول لأي مستخدم مصدق عليه

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

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

سحابة Firestore

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

قاعدة بيانات الوقت الحقيقي

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

سحابة التخزين

// 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;
    }
  }
}
الحل: تضييق الوصول باستخدام شروط الأمان.

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

سحابة Firestore

قاعدة بيانات الوقت الحقيقي

سحابة التخزين

(قاعدة بيانات الوقت الفعلي) قواعد موروثة بشكل غير صحيح

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

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

وصول مغلق

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

سحابة 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;
    }
  }
}

قاعدة بيانات الوقت الحقيقي

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

سحابة التخزين

// 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 كخلفية للخادم فقط جنبًا إلى جنب مع Firebase Admin SDK. بينما يكون آمنًا ، يجب أن تختبر أن عملاء التطبيق الخاص بك يمكنهم استرداد البيانات بشكل صحيح.

تعرف على المزيد حول قواعد أمان Cloud Firestore وكيف تعمل في Get Started with Cloud Firestore Security Rules .

اختبر قواعد أمان Cloud Firestore

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

للتحقق بسرعة من صحة قواعد أمان Firebase في وحدة تحكم Firebase ، استخدم محاكي قواعد Firebase .