הסבר על כללי האבטחה של מסד הנתונים בזמן אמת ב-Firebase

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

כללי האבטחה של מסד הנתונים בזמן אמת כוללים תחביר שדומה ל-JavaScript, והם מחולקים לארבעה סוגים:

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

סקירה כללית על האבטחה ב-Realtime Database

Firebase Realtime Database מספק ערכת כלים מלאה לניהול של האפליקציה. הכלים האלה מאפשרים לכם לאמת בקלות את המשתמשים, לאכוף הרשאות משתמשים ולאמת את מקורות הקלט.

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

אימות

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

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

הרשאה

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

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

הכללים .read ו-.write יורדים, לכן קבוצת הכללים הזו מעניקה גישת קריאה לכל הנתונים בנתיב /foo/ וברמה עמוקה יותר נתיבים כמו /foo/bar/baz. חשוב לשים לב ש.read וגם הכללים פחות עמוקים במסד הנתונים של .write מבטלים כללים עמוקים יותר, לכן בדוגמה הזו עדיין תינתן גישת קריאה אל /foo/bar/baz גם אם כלל בנתיב /foo/bar/baz מקבל ערך False.

כללי האבטחה של מסדי נתונים בזמן אמת כוללים משתנים מובנים ופונקציות שמאפשרות להתייחס לנתיבים אחרים, חותמות זמן בצד השרת, פרטי אימות, ועוד. דוגמה לכלל שמעניק גישת כתיבה עבור משתמשים מאומתים ב-/users/<uid>/, כאשר <uid> תואם לערך המזהה של המשתמש שהתקבל דרך Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

אימות נתונים

הקובץ Firebase Realtime Database ללא סכימה. כך קל לשנות דברים במהלך הפיתוח, אבל ברגע שהאפליקציה מוכנה להפצה, חשוב כדי לשמור על עקביות. שפת הכללים כוללת כלל .validate שמאפשר לכם להחיל לוגיקה של אימות באמצעות אותם ביטויים שמשמשים לכללי .read ו-.write. ההבדל היחיד הוא שכללי אימות לא פועלים ברצף, כך שכל כללי האימות הרלוונטיים חייבים להניב את הערך true כדי לאפשר את הכתיבה.

לפי הכלל הזה, הנתונים שנכתבו אל /foo/ חייבים להיות מחרוזת באורך של פחות מ-100 תווים:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

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

הגדרת אינדקסים של מסדי נתונים

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

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

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

השלבים הבאים