תקן חוקים לא בטוחים

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

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

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

הבן את כללי האבטחה שלך ב-Cloud Firestore

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

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

תרחישים נפוצים עם כללים לא בטוחים

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

גישה חופשית

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

לא מומלץ: גישת קריאה וכתיבה לכל המשתמשים.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
פתרון: כללים המגבילים גישת קריאה וכתיבה.

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

בעל תוכן בלבד

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

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

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 write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

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

לפעמים, כללי האבטחה של Cloud Firestore בודקים שמשתמש מחובר, אך לא מגבילים יותר את הגישה על סמך האימות הזה. אם אחד מהכללים שלך כולל auth != null , אשר שאתה רוצה שלכל משתמש מחובר תהיה גישה לנתונים.

לא מומלץ: לכל משתמש מחובר יש גישת קריאה וכתיבה לכל מסד הנתונים שלך.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
פתרון: צמצם גישה באמצעות תנאי אבטחה.

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

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

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

גישה מבוססת תכונות

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

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

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 write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

גישה סגורה

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

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

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

למידע נוסף על כללי האבטחה של Cloud Firestore וכיצד הם פועלים , ראה תחילת העבודה עם כללי האבטחה של Cloud Firestore .

בדוק את כללי האבטחה של Cloud Firestore שלך

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

כדי לבדוק במהירות את כללי האבטחה המעודכנים של Cloud Firestore במסוף Firebase, השתמש בכלי Rules Playground.

  1. כדי לפתוח את מגרש המשחקים של הכללים, לחץ על מגרש המשחקים של הכללים מהכרטיסייה כללים .
  2. בהגדרות מגרש המשחקים של הכללים , בחר אפשרויות למבחן שלך, כולל:
    • בדיקת קריאה או כתיבה
    • מיקום ספציפי במסד הנתונים שלך, בתור נתיב
    • סוג אימות - לא מאומת, משתמש אנונימי מאומת או מזהה משתמש ספציפי
    • נתונים ספציפיים למסמך שהכללים שלך מתייחסים אליהם באופן ספציפי (לדוגמה, אם הכללים שלך דורשים נוכחות של שדה ספציפי לפני שמתירים כתיבה)
  3. לחץ על הפעל וחפש את התוצאות בבאנר שמעל לחלון הכללים.