למד את תחביר הליבה של שפת Firebase Security Rules for Cloud Storage

כללי האבטחה של Firebase עבור Cloud Storage מאפשרים לך לשלוט בגישה לאובייקטים המאוחסנים בדליים של Cloud Storage. תחביר הכללים הגמיש מאפשר לך ליצור כללים לשלוט בכל פעולה, מכל הכתיבה לדלי של Cloud Storage שלך ​​ועד לפעולות על קובץ ספציפי.

מדריך זה מתאר את התחביר והמבנה הבסיסיים של כללי אבטחת Cloud Storage ליצירת ערכות כללים שלמות.

הצהרת שירות ומאגר מידע

כללי האבטחה של Firebase עבור אחסון בענן מתחילים תמיד בהצהרה הבאה:

service firebase.storage {
    // ...
}

הצהרת service firebase.storage את הכללים ל-Cloud Storage, ומונעת התנגשויות בין כללי האבטחה של Cloud Storage לבין כללים עבור מוצרים אחרים כגון Cloud Firestore.

כללי קריאה/כתיבה בסיסיים

כללים בסיסיים מורכבים מהצהרת match המזהה דליים של Cloud Storage, הצהרת התאמה המציינת שם קובץ 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";
}

נתונים היררכיים

כפי שאמרנו קודם, אין מבנה היררכי בתוך דלי של Cloud Storage. אבל על ידי שימוש במוסכמה של שמות קבצים, לעתים קרובות כזו שכוללת קוביות בשמות קבצים, אנו יכולים לחקות מבנה שנראה כמו סדרה מקוננת של ספריות ותתי ספריות. חשוב להבין כיצד כללי האבטחה של Firebase מקיימים אינטראקציה עם שמות הקבצים הללו.

שקול את המצב של קבוצה של קבצים עם שמות שמתחילים כולם ב- /images/ . כללי האבטחה של Firebase חלים רק בשם הקובץ המותאם, כך שבקרות הגישה המוגדרות ב- /images/ לא חלות על ה- /mp3s/ . במקום זאת, כתוב כללים מפורשים התואמים לתבניות שונות של שמות קבצים:

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 של התוצאה של כל הערכות הכללים. כלומר, אם כלל כלשהו שהקובץ תואם evalutes ל- true , התוצאה היא true .

בכללים שלמעלה, ניתן לקרוא את הקובץ "images/profilePhoto.png" אם condition או other_condition מוערכים כ-true, בעוד שהקובץ "images/users/user:12345/profilePhoto.png" כפוף רק לתוצאה של other_condition .

כללי האבטחה של Cloud Storage אינם משתפכים, וכללים מוערכים רק כאשר נתיב הבקשה תואם נתיב עם כללים שצוינו.

גרסה 1

כללי האבטחה של Firebase משתמשים בגרסה 1 כברירת מחדל. בגרסה 1, תווים כלליים רקורסיביים תואמים רכיב אחד או יותר של שם קובץ, לא אפס או יותר אלמנטים. לפיכך, match /images/{filenamePrefixWildcard}/{imageFilename=**} תואם לשם קובץ כמו /images/profilePics/profile.png, אך לא /images/badge.png. השתמש /images/{imagePrefixorFilename=**} במקום זאת.

תווים כלליים רקורסיביים חייבים להגיע בסוף הצהרת התאמה.

אנו ממליצים להשתמש בגרסה 2 עבור התכונות החזקות יותר שלה.

גרסה 2

בגרסה 2 של Firebase Security Rules, תווים כלליים רקורסיביים תואמים לאפס פריטי נתיב או יותר. לפיכך, /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 file 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 file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) 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);
    })
});

כללים ב-Cloud Storage אבטחה מעריכים כל שאילתה מול התוצאה הפוטנציאלית שלה ונכשל בבקשה אם הוא יכול להחזיר קובץ שללקוח אין הרשאה לקרוא. בקשות גישה חייבות לעמוד באילוצים שנקבעו בכללים שלך.

הצעדים הבאים

אתה יכול להעמיק את ההבנה שלך בכללי האבטחה של Firebase עבור אחסון בענן:

  • למד את המושג העיקרי הבא של שפת הכללים, תנאים דינמיים , המאפשרים לכללים שלך לבדוק הרשאות משתמש, להשוות נתונים קיימים ונכנסים, לאמת נתונים נכנסים ועוד.

  • סקור מקרי שימוש אופייניים באבטחה ואת הגדרות כללי האבטחה של Firebase המטפלים בהם .

אתה יכול לחקור את כללי האבטחה של Firebase מקרי שימוש ספציפיים ל-Cloud Storage: