فهم قواعد أمان قاعدة بيانات Firebase في الوقت الفعلي

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

تتضمّن قواعد أمان "قاعدة بيانات الوقت الفعلي" بنية شبيهة ببنية JavaScript، وهي تأتي بأربعة أنواع:

أنواع القواعد
‎.read يوضّح ما إذا كان يُسمح للمستخدمين بقراءة البيانات ومتى يُسمح لهم بذلك.
‎.write يصف ما إذا كان يُسمح بكتابة البيانات وحالات السماح بذلك.
‎.validate تحدّد هذه السمة الشكل الذي ستظهر به القيمة المنسّقة بشكل صحيح، وما إذا كانت تحتوي على سمات فرعية، ونوع البيانات.
‎.indexOn تُستخدَم لتحديد عنصر فرعي لفهرسته لتتمكّن من ترتيب العناصر وإجراء طلبات بحث.

نظرة عامة على أمان Realtime Database

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

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

المصادقة

من الخطوات الشائعة الأولى لتأمين تطبيقك هو تحديد هوية المستخدمين. وتُعرف هذه العملية باسم المصادقة. يمكنك استخدام Firebase Authentication لطلب تسجيل دخول المستخدمين إلى تطبيقك. تتضمّن Firebase Authentication إمكانية استخدام طرق المصادقة الشائعة، مثل Google و Facebook، بالإضافة إلى تسجيل الدخول باستخدام عنوان البريد الإلكتروني وكلمة المرور وتسجيل الدخول بدون إظهار الهوية وغير ذلك.

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

التفويض

إنّ تحديد هوية المستخدم هو جزء فقط من الأمان. بعد معرفة هوية هؤلاء المستخدمين، تحتاج إلى طريقة للتحكّم في إمكانية وصولهم إلى البيانات في قاعدة بياناتك. تتيح لك قواعد أمان "قاعدة بيانات الوقت الفعلي" التحكّم في أذونات الوصول لكل مستخدم. على سبيل المثال، إليك مجموعة من قواعد الأمان التي تسمح لأي مستخدم بقراءة المسار /foo/، ولكن لا يمكنه الكتابة فيه:

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

يتم تطبيق قواعد .read و.write بشكل متسلسل، لذا تمنح مجموعة القواعد هذه إذن الوصول للقراءة إلى أي بيانات في المسار /foo/ بالإضافة إلى أي مسارات أعمق مثل /foo/bar/baz. يُرجى العِلم أنّ قواعد .read و .write الأقرب إلى السطح في قاعدة البيانات تلغي القواعد الأبعد، لذا سيظلّ من الممكن منح إذن الوصول للقراءة إلى /foo/bar/baz في هذا المثال حتى إذا تم تقييم قاعدة في المسار /foo/bar/baz على أنّها خطأ.

تتضمّن قواعد أمان "قاعدة بيانات الوقت الفعلي" متغيّرات مضمّنة ودوالّ تتيح لك الإشارة إلى مسارات أخرى وطابعات زمنيّة من جهة الخادم ومعلومات المصادقة وغيرها. في ما يلي مثال على قاعدة تمنح إذن الكتابة للمستخدمين المعتمَدين في /users/<uid>/، حيث <uid> هو رقم تعريف المستخدم الذي تم الحصول عليه من خلال Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

التحقّق من صحة البيانات

Firebase Realtime Database لا يتضمّن مخطّطًا. يسهّل ذلك تغيير العناصر أثناء عملية التطوير، ولكن بعد أن يصبح تطبيقك جاهزًا للنشر، من المهم أن تظل البيانات متسقة. تتضمّن لغة القواعد قاعدة .validate تسمح لك بتطبيق منطق التحقّق باستخدام التعبيرات نفسها المستخدَمة لقواعد .read و.write. الاختلاف الوحيد هو أنّ قواعد التحقّق لا تسري بشكل متسلسل، لذا يجب تقييم جميع قواعد التحقّق ذات الصلة على أنّها صحيحة لكي يُسمح بالكتابة.

تفرض هذه القواعد أن تكون البيانات المكتوبة في /foo/ سلسلة أقصر من 100 حرف:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

يمكن لقواعد التحقّق الوصول إلى جميع الدوالّ المضمّنة والمتغيّرات نفسها المتوفّرة في قواعد .read و.write. يمكنك استخدام هذه القواعد لإنشاء قواعد التحقّق من الصحة التي تكون على دراية بالبيانات في مكان آخر في قاعدة بياناتك، وهوية المستخدم، ووقت الخادم، وغير ذلك الكثير.

تحديد فهارس قاعدة البيانات

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

يتم تحديد الفهارس باستخدام قاعدة .indexOn. في ما يلي مثال على بيان فهرس سيؤدّي إلى فهرسة حقلَي الارتفاع والطول لقائمة الديناصورات:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

الخطوات التالية

  • ابدأ بالتخطيط لتطوير قواعد قاعدة بياناتك.
  • اطّلِع على مزيد من المعلومات عن تأمين بياناتك باستخدام قواعد الأمان.
  • اطّلِع على مزيد من المعلومات عن تحديد الفهارس باستخدام القواعد.