Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

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

Cloud 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 הם הגנה היחידה החוסמת גישה למשתמשים זדוניים. להגדרת כללים בנפרד מהגיון המוצר יש מספר יתרונות: לקוחות אינם אחראים לאכיפת האבטחה, יישומי באגי לא יפגעו בנתונים שלך, והכי חשוב, אתה לא מסתמך על שרת מתווך כדי להגן על נתונים מהעולם.

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

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

Cloud 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;
    }
  }
}

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

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

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

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

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

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

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

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

Cloud 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;
    }
  }
}

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

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

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

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

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

Cloud 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 בודקים את הבקשה מול הנתונים ממסד הנתונים או מהמטא נתונים של הקובץ כדי לאשר או לשלול גישה.

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

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

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

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

תכונות ותפקידים מוגדרים

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

Cloud Firestore

זכור כי בכל פעם שהכללים שלך כוללים קריאה, כמו הכללים להלן, אתה מחויב על פעולת קריאה ב- Cloud 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 אימות ואז למנף את הטענות בכללים שלך.

Cloud Firestore

זכור כי בכל פעם שהכללים שלך כוללים קריאה, כמו הכללים להלן, אתה מחויב על פעולת קריאה ב- Cloud 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;
  }
}