למד את תחביר הליבה של שפת 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/ stam. במקום זאת, כתוב כללים מפורשים התואמים לדפוסי שמות קבצים שונים:

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/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 and 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 file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/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 המטפלים בהם .

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