Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

כללי אבטחה בסיסיים

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

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

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

כללי ברירת מחדל: מצב נעול

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

ענן Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

מסד נתונים בזמן אמת

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

אחסון בענן

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

כללי פיתוח-סביבה

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

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

כל המשתמשים המאומתים

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

ענן Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

מסד נתונים בזמן אמת

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

אחסון בענן

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

כללים מוכנים לייצור

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

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

גישה לבעלים של תוכן בלבד

כללים אלה מגבילים את הגישה לבעלים המאומת של התוכן בלבד. הנתונים ניתנים לקריאה וכתיבה רק על ידי משתמש אחד, ונתיב הנתונים מכיל את מזהה המשתמש.

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

כאשר כלל זה לא עובד: מערך הכללים הזה לא עובד כאשר מספר משתמשים צריכים לכתוב או לקרוא את אותם נתונים - המשתמשים יחליפו נתונים או לא יוכלו לגשת לנתונים שיצרו.

להגדרת כלל זה: צור כלל המאשר שהמשתמש המבקש גישה לקרוא או לכתוב נתונים הוא המשתמש שבבעלותו נתונים אלה.

ענן Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

מסד נתונים בזמן אמת

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth != null && auth.uid == $uid"
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

אחסון בענן

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

גישה ציבורית ופרטית מעורבת

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

כאשר כלל זה עובד: כלל זה עובד היטב עבור אפליקציות הדורשות אלמנטים הניתנים לקריאה ציבורית, אך עליהם להגביל את גישת העריכה לבעלי אותם אלמנטים. לדוגמא, אפליקציית צ'אט או בלוג.

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

כדי להגדיר כלל זה: צור כלל המאפשר גישה לקריאה לכל המשתמשים (או לכל המשתמשים המאומתים) ומאשר שהנתונים שכותבים המשתמשים הם הבעלים.

ענן Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

מסד נתונים בזמן אמת

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid != null" for only authenticated users
        ".write": "auth.uid == $uid"
      }
    }
  }
}

אחסון בענן

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

גישה מבוססת תכונות וגישה מבוססת תפקיד

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

כאשר כלל זה עובד: אם אתה מקצה תפקיד למשתמשים, כלל זה מקל על הגבלת הגישה על סמך תפקידים או קבוצות משתמשים ספציפיות. לדוגמא, אם אחסנת ציונים, תוכל להקצות רמות גישה שונות לקבוצת "תלמידים" (לקרוא את התוכן שלהם בלבד), לקבוצת "המורים" (לקרוא ולכתוב במקצועם) ולקבוצת "מנהלים" (קרא כל התוכן).

כשכלל זה לא עובד: במאגר מידע בזמן אמת ואחסון ענן, הכללים שלך אינם יכולים למנף את שיטת get() שכללי Cloud Firestore יכולים לשלב. כתוצאה מכך, עליך לבנות את מטה הנתונים של מסד הנתונים או הקבצים שלך כך שישקף את התכונות שבהן אתה משתמש בכללים שלך.

להגדרת כלל זה: בענן Firestore, כלול שדה במסמכי המשתמשים שאתה יכול לקרוא, ואז בנה את הכלל שלך כך שיקרא את השדה הזה ותעניק גישה עליו. במסד נתונים בזמן אמת, צור נתיב נתונים המגדיר את משתמשי האפליקציה שלך ומעניק להם תפקיד בצומת ילדים.

באפשרותך גם להגדיר תביעות מותאמות אישית באימות ולאחר מכן לאחזר מידע auth.token בכל כללי האבטחה של Firebase.

תכונות ותפקידים שהוגדרו על ידי נתונים

כללים אלה פועלים רק במסד הנתונים של Cloud Firestore וב- Realtime.

ענן Firestore

זכור שבכל פעם שהכללים שלך כוללים קריאה, כמו הכללים שלהלן, תחויב בגין פעולת קריאה בענן Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

מסד נתונים בזמן אמת

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
        ".read": true
      }
    }
  }
}

מאפיינים ותפקידים בעלי תביעה מותאמת אישית

כדי ליישם כללים אלה, הגדר תביעות מותאמות אישית באימות Firebase ולאחר מכן השתמש בתביעות בכללים שלך.

ענן Firestore

זכור שבכל פעם שהכללים שלך כוללים קריאה, כמו הכללים שלהלן, תחויב בגין פעולת קריאה בענן Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

מסד נתונים בזמן אמת

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid != null && auth.token.writer == true",
        ".read": "auth.uid != null && auth.token.reader == true"
      }
    }
  }
}

אחסון בענן

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}