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

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

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

قم بالوصول إلى قواعد أمان Firebase الخاصة بك

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

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

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

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

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

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

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

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

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

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

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

سحابة فايرستور

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

سحابة فايرستور

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

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

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

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

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

سحابة فايرستور

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

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

سحابة فايرستور

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

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

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

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

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

وصول مغلق

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

سحابة فايرستور

// 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 وكيفية عملها في بدء استخدام قواعد أمان Cloud Firestore .

اختبر قواعد أمان Cloud Firestore الخاصة بك

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

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