כללי האבטחה של Firebase Realtime Database קובעים למי יש גישת קריאה וכתיבה למסד הנתונים, איך הנתונים שלכם מובנים ואילו אינדקסים קיימים. הכללים האלה נמצאים בשרתי Firebase ונאכפים אוטומטית בכל שלב. כל בקשת קריאה וכתיבה תושלם רק אם הכללים שלכם מאפשרים זאת. כברירת מחדל, הכללים לא מאפשרים לאף אחד גישה למסד הנתונים. אנחנו עושים את זה כדי להגן על מסד הנתונים מפני ניצול לרעה עד שתהיה לכם אפשרות להתאים אישית את הכללים או להגדיר אימות.
כללי האבטחה של Realtime Database הם בעלי תחביר שדומה ל-JavaScript, ויש ארבעה סוגים של כללים:
| סוגי כללים | |
|---|---|
| .read | האם ומתי מותר למשתמשים לקרוא את הנתונים. |
| .write | תיאור של האפשרות לכתוב נתונים, ואם כן, מתי. |
| .validate | המאפיין הזה מגדיר איך ייראה ערך בפורמט תקין, אם יש לו מאפייני משנה ומהו סוג הנתונים. |
| .indexOn | מציין ילד לאינדקס כדי לתמוך בסידור ובשאילתות. |
Realtime Database סקירה כללית על אבטחה
ב-Firebase Realtime Database יש קבוצה מלאה של כלים לניהול האבטחה של האפליקציה. הכלים האלה מאפשרים לאמת את המשתמשים, לאכוף את הרשאות המשתמשים ולאמת את הקלט.
באפליקציות שמבוססות על Firebase מופעל יותר קוד בצד הלקוח מאשר באפליקציות עם הרבה סוגים אחרים של חבילות טכנולוגיות. לכן, הגישה שלנו לאבטחה עשויה להיות שונה קצת ממה שאתם רגילים.
אימות
שלב ראשון נפוץ באבטחת האפליקציה הוא זיהוי המשתמשים. התהליך הזה נקרא אימות. אתם יכולים להשתמש באימות ב-Firebase כדי לאפשר למשתמשים להיכנס לאפליקציה שלכם. אימות ב-Firebase כולל תמיכה מוכנה לשימוש בשיטות אימות נפוצות כמו Google ו-Facebook, וגם כניסה באמצעות אימייל וסיסמה, כניסה אנונימית ועוד.
זהות המשתמש היא מושג חשוב באבטחה. למשתמשים שונים יש נתונים שונים, ולפעמים יש להם יכולות שונות. לדוגמה, באפליקציית צ'אט, כל הודעה משויכת למשתמש שיצר אותה. יכול להיות שמשתמשים יוכלו למחוק את ההודעות שלהם, אבל לא הודעות שפורסמו על ידי משתמשים אחרים.
הרשאה
זיהוי המשתמש הוא רק חלק מהאבטחה. אחרי שמזהים את המשתמשים, צריך דרך לשלוט בגישה שלהם לנתונים במסד הנתונים. כללי האבטחה של Realtime Database מאפשרים לכם לשלוט בגישה של כל משתמש. לדוגמה, הנה קבוצה של כללי אבטחה שמאפשרת לכל אחד לקרוא את הנתיב /foo/, אבל לא מאפשרת לאף אחד לכתוב בו:
{
"rules": {
"foo": {
".read": true,
".write": false
}
}
}הכללים של .read ושל .write הם כללים מדורגים, ולכן קבוצת הכללים הזו מעניקה גישת קריאה לכל הנתונים בנתיב /foo/, וגם לכל הנתיבים העמוקים יותר, כמו /foo/bar/baz. חשוב לזכור שכללים של .read ושל .write ברמה גבוהה יותר במסד הנתונים מבטלים כללים ברמה נמוכה יותר, ולכן במקרה הזה עדיין תינתן גישת קריאה ל-/foo/bar/baz גם אם כלל בנתיב /foo/bar/baz יחזיר את הערך false.
כללי האבטחה של Realtime Database כוללים
משתנים מובנים
ופונקציות שמאפשרים לכם להתייחס לנתיבים אחרים, לחותמות זמן בצד השרת, לפרטי אימות ועוד. דוגמה לכלל שמעניק למשתמשים מאומתים הרשאת כתיבה ל-/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. דוגמה להצהרת אינדקס שתבצע אינדקס של השדות height ו-length עבור רשימה של דינוזאורים:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}השלבים הבאים
- איך מתחילים לפתח כללים לתכנון מסד הנתונים.
- מידע נוסף על אבטחת הנתונים באמצעות כללי אבטחה
- מידע נוסף על הגדרת אינדקסים באמצעות כללים