Check out what’s new from Firebase at Google I/O 2022. Learn more

تعرف على البنية الأساسية لقواعد أمان Firebase للغة التخزين السحابي

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

يصف هذا الدليل البنية الأساسية وهيكل قواعد أمان التخزين السحابي لإنشاء مجموعات قواعد كاملة.

إعلان الخدمة وقاعدة البيانات

تبدأ قواعد أمان Firebase للتخزين السحابي دائمًا بالإعلان التالي:

service firebase.storage {
    // ...
}

يحدد إعلان service firebase.storage القواعد الخاصة بالتخزين السحابي ، مما يمنع التعارض بين قواعد وقواعد أمان التخزين السحابي للمنتجات الأخرى مثل Cloud Firestore.

قواعد القراءة / الكتابة الأساسية

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

في مجموعة القواعد الافتراضية ، تستخدم عبارة match الأولى تعبير حرف بدل {bucket} للإشارة إلى تطبيق القواعد على كل المجموعات في مشروعك. سنناقش فكرة مطابقات أحرف البدل أكثر في القسم التالي.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

جميع بيانات المباراة تشير إلى الملفات. يمكن أن يشير بيان المطابقة إلى ملف معين ، كما في match /images/profilePhoto.png .

تطابق أحرف البدل

بالإضافة إلى الإشارة إلى ملف واحد ، يمكن للقواعد استخدام أحرف البدل للإشارة إلى أي ملف ببادئة سلسلة معينة في اسمه ، بما في ذلك الشرطات المائلة ، كما هو الحال في match /images/{imageId} .

في المثال أعلاه ، تستخدم تعليمة المطابقة صيغة حرف البدل {imageId} . هذا يعني أن القاعدة تنطبق على أي ملف /images/ في بداية اسمه ، مثل /images/profilePhoto.png أو /images/croppedProfilePhoto.png . عندما يتم تقييم تعبيرات allow في عبارة المطابقة ، فإن متغير imageId سيحل اسم ملف الصورة ، مثل profilePhoto.png أو croppedProfilePhoto.png .

يمكن الرجوع إلى متغير حرف بدل من داخل match لتوفير اسم الملف أو ترخيص المسار:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

البيانات الهرمية

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

ضع في اعتبارك حالة مجموعة من الملفات بأسماء تبدأ جميعها بـ /images/ stem. تنطبق قواعد أمان Firebase فقط على اسم الملف المطابق ، لذلك لا تنطبق عناصر التحكم في الوصول المحددة في /images/ stem على /mp3s/ stem. بدلاً من ذلك ، اكتب قواعد صريحة تتطابق مع أنماط أسماء الملفات المختلفة:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

عند تضمين عبارات match المتداخلة ، يتم دائمًا إلحاق مسار عبارة match الداخلية بمسار عبارة match الخارجية. وبالتالي فإن القاعدتين التاليتين متساويتان:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

تكرار تطابق أحرف البدل

بالإضافة إلى أحرف البدل التي تطابق السلاسل وتعيدها في نهاية اسم الملف ، يمكن الإعلان عن حرف بدل متعدد الأجزاء لمطابقة أكثر تعقيدًا عن طريق إضافة =** إلى اسم حرف البدل ، مثل {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

إذا تطابق العديد من القواعد مع ملف ، فإن النتيجة هي OR لنتيجة جميع تقييمات القواعد. أي ، إذا كانت هناك أي قاعدة يطابقها الملف ، فإن التقييم يكون true ، تكون النتيجة true .

في القواعد المذكورة أعلاه ، يمكن قراءة الملف "images / other_condition " إذا تم تقييم أي من condition أو الحالة الأخرى على أنها صحيحة ، في حين أن الملف "images / users / user: 12345 / profilePhoto.png" يخضع فقط لنتيجة other_condition .

لا تتالي قواعد أمان التخزين السحابي ، ولا يتم تقييم القواعد إلا عندما يتطابق مسار الطلب مع المسار مع القواعد المحددة.

النسخة 1

تستخدم قواعد أمان Firebase الإصدار 1 افتراضيًا. في الإصدار 1 ، تطابق أحرف البدل العودية عنصرًا واحدًا أو أكثر من عناصر اسم الملف ، وليس صفرًا أو أكثر من العناصر. وبالتالي ، فإن match /images/{filenamePrefixWildcard}/{imageFilename=**} تتطابق مع اسم ملف مثل /images/profilePics/profile.png ، ولكن ليس /images/badge.png. استخدم /images/{imagePrefixorFilename=**} بدلاً من ذلك.

يجب أن تأتي أحرف البدل العودية في نهاية بيان المباراة.

نوصيك باستخدام الإصدار 2 لميزاته الأكثر قوة.

الإصدار 2

في الإصدار 2 من قواعد أمان Firebase ، تطابق أحرف البدل المتكررة صفرًا أو أكثر من عناصر المسار. وبالتالي ، فإن /images/{filenamePrefixWildcard}/{imageFilename=**} تطابق أسماء الملفات /images/profilePics/profile.png و /images/badge.png.

يجب عليك الاشتراك في الإصدار 2 عن طريق إضافة rules_version = '2'; في الجزء العلوي من قواعد الأمان الخاصة بك:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

يمكن أن يكون لديك حرف بدل متكرر واحد على الأكثر لكل بيان مباراة ، ولكن في الإصدار 2 ، يمكنك وضع حرف البدل هذا في أي مكان في بيان المباراة. فمثلا:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

العمليات الحبيبية

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

يمكن تقسيم عملية read إلى get و list .

يمكن تقسيم قاعدة write إلى create update delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single document read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to nonexistent files
      allow create: if <condition>;

      // Applies to updates to file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

تداخل بيانات المباراة

من الممكن أن يتطابق اسم الملف مع أكثر من بيان match . في حالة تطابق تعبيرات allow المتعددة مع طلب ما ، يُسمح بالوصول إذا true أي من الشروط:

service firebase.storage {
  match b/{bucket}/o {
    // Matches any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

في المثال أعلاه ، يُسمح للجميع بالقراءة والكتابة إلى الملفات ذات السلسلة /images/ في أي مكان في اسم الملف الخاص بهم لأن القاعدة الثانية true دائمًا ، على الرغم من أن القاعدة الأولى false دائمًا.

القواعد ليست مرشحات

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

على سبيل المثال ، خذ قاعدة الأمان التالية:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

مرفوض : ترفض هذه القاعدة الطلب التالي لأن مجموعة النتائج يمكن أن تتضمن ملفات لا يكون فيها contentType image/png :

الويب
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

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

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

يمكنك تعميق فهمك لقواعد أمان Firebase للتخزين السحابي:

يمكنك استكشاف حالات استخدام قواعد أمان Firebase الخاصة بالتخزين السحابي: