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

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

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

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

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

בעת יצירת מופע באתר או אחסון במסוף Firebase, אתה יכול לבחור אם כללי אבטחת Firebase שלך להגביל גישה לנתונים שלך (מצב נעול) או לאפשר גישה לאף אחד (במצב מבחן). בענן 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;
    }
  }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

מאפיינים ותפקידים מוגדרים לנתונים

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

ענן 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;
  }
}