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

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

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

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

סוגי כללים
.לקרוא מתאר אם ומתי מותר לקרוא נתונים על ידי משתמשים.
.לִכתוֹב מתאר אם ומתי מותר לכתוב נתונים.
.לְאַמֵת מגדיר כיצד ייראה ערך בפורמט נכון, האם יש לו תכונות צאצא וסוג הנתונים.
.indexOn מציין ילד לאינדקס כדי לתמוך בהזמנה ובשאילתות.

סקירת אבטחת מסד נתונים בזמן אמת

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

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

אימות

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

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

הרשאה

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

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

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

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

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

אימות מידע

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

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

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

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

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

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

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

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

הצעדים הבאים