כלל: סוגים
.לקרוא
מעניק ללקוח גישת קריאה למיקום של Firebase Realtime Database.
כלל .read
הוא סוג של כלל אבטחה המעניק ללקוח גישת קריאה למיקום של Firebase Realtime Database. לדוגמה:
".read": "auth != null && auth.provider == 'twitter'"
הערך של כלל .read
הוא מחרוזת, המוערכת כתת-קבוצה של תחביר הביטוי של JavaScript עם כמה שינויים התנהגותיים כדי להגביר את הבהירות והנכונות. כלל .read
המעניק הרשאה לקרוא מיקום יאפשר גם קריאה של כל צאצא של אותו מיקום, גם אם לצאצאים יש חוקי .read
משלהם שנכשלים.
לכלל .read
יש גישה לכל משתני הכללים של Firebase Realtime Database מלבד newData
.
.לִכתוֹב
מעניק ללקוח גישת כתיבה למיקום של Firebase Realtime Database.
כלל .write
הוא סוג של כלל אבטחה המעניק ללקוח גישת כתיבה למיקום של מסד נתונים של Firebase בזמן אמת. לדוגמה:
".write": "auth != null && auth.token.isAdmin == true"
הערך של כלל .write
הוא מחרוזת, המוערכת כתת-קבוצה של תחביר הביטוי של JavaScript עם כמה שינויים התנהגותיים כדי להגביר את הבהירות והנכונות. כלל .write
המעניק הרשאה לכתוב למיקום יאפשר גם כתיבה לכל צאצא של אותו מיקום, גם אם לצאצאים יש חוקי .write
משלהם.
לכלל .write
יש גישה לכל משתני החוקים של Firebase Realtime Database.
.לְאַמֵת
משמש לאחר שכלל .write
העניק גישה, כדי להבטיח שהנתונים הנכתבים תואמים לסכימה ספציפית.
כלל .validate
משמש לאחר שכלל .write
העניק גישה, כדי להבטיח שהנתונים הנכתבים תואמים לתקן ספציפי. בנוסף ל- .write
המעניק גישה, כל כללי .validate
הרלוונטיים חייבים להצליח לפני שתתאפשר כתיבה. לדוגמה:
".validate": "newData.hasChildren(['name', 'age'])"
הערך של כלל .validate
הוא מחרוזת, המוערכת כתת-קבוצה של תחביר הביטוי של JavaScript עם כמה שינויים התנהגותיים כדי להגביר את הבהירות והנכונות.
לכלל .validate
יש גישה לכל משתני החוקים של Firebase Realtime Database.
.indexOn
משפר את ביצועי השאילתות על ידי הסבר ל-Firebase Realtime Database אילו מפתחות אתה רוצה שהנתונים שלך יתווספו לאינדקס.
כלל .indexOn
אומר לשרתי Firebase Realtime Database להוסיף מפתחות ספציפיים בנתונים שלך כדי לשפר את הביצועים של השאילתות שלך. לדוגמה, בהינתן מסד נתונים עם אוסף של נתוני דינוזאורים, אנו יכולים לומר ל-Firebase Realtime Database לבצע אופטימיזציה עבור שאילתות, לפני שהן מוחזרות מהשרתים, על ידי הוספת כלל זה:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
תוכל לברר מידע נוסף על כלל .indexOn
על ידי עיון בסעיף של מדריך האבטחה על הוספת הנתונים שלך לאינדקס .
כלל: משתנים
אישור
משתנה המכיל את מטען האסימון אם לקוח מאומת, או null
אם הלקוח אינו מאומת.
Firebase Realtime Database מאפשר לך לבצע אימות בקלות מול מספר ספקים מובנים וייצור עבורם אסימוני אימות. לאחר שמשתמש מאומת עם אחד מהספקים המובנים, משתנה האימות יכיל את הדברים הבאים:
שדה | תיאור |
---|---|
provider | שיטת האימות שבה נעשה שימוש (למשל "סיסמה", "אנונימי", "פייסבוק", "github", "גוגל" או "טוויטר"). |
uid | מזהה משתמש ייחודי, מובטח להיות ייחודי בכל הספקים. |
token | התוכן של אסימון Firebase Auth ID. ראה auth.token . |
כדוגמה, יכול להיות לנו כלל כמו הבא כדי לאפשר למשתמשים ליצור הערות כל עוד הם מאחסנים את מזהה המשתמש שלהם עם ההערה:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
}
}
}
נוכל גם לקבוע כלל כמו הבא כדי לאפשר למשתמשים ליצור הערות כל עוד הם מחוברים באמצעות Facebook:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && auth.provider == 'facebook'"
}
}
}
auth.token
משתנה המכיל את התוכן של אסימון Firebase Auth ID.
האסימון מכיל חלק מהמפתחות הבאים או את כולם:
שדה | תיאור |
---|---|
email | כתובת האימייל המשויכת לחשבון, אם קיימת. |
email_verified | true אם המשתמש אימת שיש לו גישה לכתובת email . חלק מהספקים מאמתים באופן אוטומטי כתובות דוא"ל בבעלותם. |
phone_number | מספר הטלפון המשויך לחשבון, אם קיים. |
name | שם התצוגה של המשתמש, אם מוגדר. |
sub | ה-UID של Firebase של המשתמש. זה ייחודי בתוך פרויקט. |
firebase.identities | מילון של כל הזהויות המשויכות לחשבון של משתמש זה. המפתחות של המילון יכולים להיות כל אחד מהאפשרויות הבאות: email , phone , google.com , facebook.com , github.com , twitter.com . הערכים של המילון הם מערכים של מזהים ייחודיים עבור כל ספק זהות המשויך לחשבון. לדוגמה, auth.token.firebase.identities["google.com"][0] מכיל את מזהה המשתמש הראשון של Google המשויך לחשבון. |
firebase.sign_in_provider | ספק הכניסה ששימש כדי להשיג את האסימון הזה. יכולה להיות אחת מהמחרוזות הבאות: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | ה-tenantId המשויך לחשבון, אם קיים. למשל tenant2-m6tyz |
אם משתמשים באימות מותאם אישית, auth.token
מכיל גם תביעות מותאמות אישית שצוינו על ידי המפתח.
ניתן להשתמש בכל הערכים הללו במסגרת כללים. לדוגמה, כדי להגביל את הגישה לחשבונות Google המשויכים לכתובת gmail.com, נוכל להוסיף את הכלל:
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
למען השלמות, השדות הבאים כלולים גם הם, ב- auth.token
, אך לא סביר שהם יהיו שימושיים עבור כללים.
שדה | תיאור |
---|---|
iss | מנפיק האסימון. |
aud | הקהל עבור האסימון. |
auth_time | הפעם האחרונה שהמשתמש אושר באמצעות אישור באמצעות המכשיר שמקבל את האסימון. |
iat | השעה בה הונפק האסימון. |
exp | השעה שבה יפוג האסימון. |
$location
משתנה שניתן להשתמש בו כדי להתייחס למפתח של $location
ששימש קודם לכן במבנה כלל.
כאשר יש לך $location
במבנה הכללים שלך, אתה יכול להשתמש במשתנה $
תואם בתוך ביטוי הכלל שלך כדי לקבל את השם של הילד הנקרא או הכתוב בפועל. אז נניח שאנחנו רוצים לתת לכל משתמש גישת קריאה וכתיבה למיקום /users/<user>
משלו. נוכל להשתמש ב:
{
"rules": {
"users": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user"
}
}
}
}
כאשר לקוח מנסה לגשת ל- /users/barney
, מיקום ברירת המחדל $user
יתאים לכך ש- $user
יהיה שווה ל-"barney". אז כלל ה- .read
יבדוק אם auth.uid === 'barney'
. כתוצאה מכך, קריאת
תצליח רק אם הלקוח מאומת באמצעות uid של "barney"./users/barney
עַכשָׁיו
מכיל את מספר האלפיות השניות מאז עידן יוניקס לפי שרתי Firebase Realtime Database.
המשתנה now
מכיל את מספר האלפיות מאז עידן UNIX לפי שרתי Firebase Realtime Database. לדוגמה, תוכל להשתמש בזה כדי לאמת שזמן created
של משתמש לעולם אינו מוגדר לשעה בעתיד:
{
"rules": {
"users": {
"$user": {
"created": {
".validate": "newData.val() < now"
}
}
}
}
}
שורש
RuleDataSnapshot התואמת לנתונים הנוכחיים בבסיס מסד הנתונים שלך בזמן אמת של Firebase.
משתנה השורש נותן לך RuleDataSnapshot התואם לנתונים הנוכחיים בבסיס מסד הנתונים שלך בזמן אמת של Firebase. אתה יכול להשתמש בזה כדי לקרוא כל נתונים במסד הנתונים שלך בביטויי הכלל שלך. לדוגמה, אם נרצה לאפשר למשתמשים לקרוא /comments
רק אם /users/<id>/active
שלהם הוגדר כ-true, נוכל להשתמש ב:
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
}
}
לאחר מכן, אם /users/barney/active
הכיל את הערך true, משתמש שאומת עם ה-uid של "barney" יוכל לכתוב לצומת /comments
.
נתונים
RuleDataSnapshot התואם לנתונים הנוכחיים במסד הנתונים של Firebase Realtime במיקום של הכלל המבצע כעת.
משתנה הנתונים נותן לך RuleDataSnapshot התואם לנתונים הנוכחיים במיקום מסד הנתונים של הכלל הפועל כעת (בניגוד ל-root, שנותן לך את הנתונים עבור השורש של מסד הנתונים שלך).
כך למשל, אם רצית לאפשר לכל לקוח לגשת ל- /users/<user>
אם /users/<user>/public
הוגדר כ-true, תוכל להשתמש ב:
{
"rules": {
"users": {
"$user": {
".read": "data.child('public').val() == true"
}
}
}
}
משתנה הנתונים זמין בכללי .read
, .write
ו- .validate
.
מידע חדש
RuleDataSnapshot התואם לנתונים שיתקבלו אם הכתיבה תתאפשר.
עבור כללי .write
ו- .validate
, המשתנה newData נותן לך RuleDataSnapshot התואם לנתונים שייווצרו אם הכתיבה תתאפשר (זהו "מיזוג" של הנתונים הקיימים בתוספת הנתונים החדשים הנכתבים). אז אם אתה רוצה להבטיח שלכל משתמש יש שם וגיל, אתה יכול להשתמש ב:
{
"rules": {
"users": {
"$user": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['name', 'age'])"
}
}
}
}
מכיוון ש-newData ממזג נתונים קיימים ונתונים חדשים, הוא מתנהג כראוי גם עבור עדכונים "חלקיים". לדוגמה:
var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();
המשתנה newData אינו זמין בכללי .read
מכיוון שאין נתונים חדשים שנכתבים. אתה צריך פשוט להשתמש בנתונים .
RuleDataSnapshot: שיטות
val()
מקבל את הערך הפרימיטיבי ( string
, number
, boolean
או null
) מ- RuleDataSnapshot זה.
ערך החזרה : ( String
, Number
, Boolean
, Null
) - הערך הפרימיטיבי מ- RuleDataSnapshot זה.
בניגוד DataSnapshot.val()
, קריאה ל- val()
ב- RuleDataSnapshot שיש לו נתוני צאצא לא תחזיר אובייקט המכיל את הילדים. במקום זאת הוא יחזיר ערך זקיף מיוחד. זה מבטיח שהכללים תמיד יכולים לפעול ביעילות רבה.
כתוצאה מכך, עליך להשתמש תמיד child()
כדי לגשת לילדים (למשל data.child('name').val()
, לא data.val().name
).
דוגמה זו מאפשרת קריאה רק אם הילד isReadable מוגדר כ-true במיקום הנקרא.
".read": "data.child('isReadable').val() == true"
יֶלֶד()
מקבל RuleDataSnapshot עבור המיקום בנתיב היחסי שצוין.
ארגומנטים : String
childPath
- נתיב יחסי למיקום של נתוני צאצא.
ערך החזרה : RuleDataSnapshot
- RuleDataSnapshot עבור מיקום הילד.
הנתיב היחסי יכול להיות שם צאצא פשוט (לדוגמה 'fred') או נתיב עמוק יותר מופרד באלכסון (למשל 'fred/name/first'). אם למיקום הילד אין נתונים, מוחזרת RuleDataSnapshot ריקה.
דוגמה זו מאפשרת קריאה רק אם הילד isReadable מוגדר כ-true במיקום הנקרא.
".read": "data.child('isReadable').val() == true"
הוֹרֶה()
מקבל RuleDataSnapshot עבור מיקום האב.
ערך החזרה : RuleDataSnapshot
- RuleDataSnapshot עבור מיקום האב.
אם מופע זה מתייחס לשורש של מסד הנתונים של Firebase Realtime, אין לו אב, ו- parent()
ייכשל, מה שיגרום לדילוג על ביטוי הכלל הנוכחי (ככשל).
דוגמה זו מאפשרת קריאה רק אם האח isReadable מוגדר כ-true.
".read": "data.parent().child('isReadable').val() == true"
hasChild(childPath)
מחזירה true אם הצאצא שצוין קיים.
טיעונים : childPath
String
- נתיב יחסי למיקום של ילד פוטנציאלי.
ערך החזרה : בוליאני - true
אם קיימים נתונים בנתיב הבן שצוין; אחרת false
.
דוגמה זו מאפשרת לכתוב את הנתונים רק אם הם מכילים "שם" בן.
".validate": "newData.hasChild('name')"
hasChildren([ילדים])
בדיקות לקיומם של ילדים.
טיעונים : Array
children
אופציונלי - מערך של מפתחות ילדים שכולם חייבים להתקיים.
ערך החזרה : Boolean
- true
אם קיימים ילדים (המצוינים); אחרת false
.
אם לא יסופקו ארגומנטים, הוא יחזיר אמת אם ל- RuleDataSnapshot יש ילדים. אם מסופק מערך של שמות צאצאים, הוא יחזיר true רק אם כל הילדים שצוינו קיימים ב- RuleDataSnapshot .
דוגמה זו מאפשרת לכתוב את הנתונים רק אם הם מכילים ילד אחד או יותר.
".validate": "newData.hasChildren()"
דוגמה זו מאפשרת לכתוב את הנתונים רק אם הם מכילים ילדים "שם" ו"גיל".
".validate": "newData.hasChildren(['name', 'age'])"
קיים()
מחזירה true אם RuleDataSnapshot זה מכיל נתונים כלשהם.
ערך החזרה : Boolean
- true
אם RuleDataSnapshot מכיל נתונים כלשהם; אחרת false
.
הפונקציה exists מחזירה true אם RuleDataSnapshot זה מכיל נתונים כלשהם. זוהי פונקציית נוחות בלבד מכיוון ש- data.exists()
שווה ערך ל- data.val() != null
.
דוגמה זו מאפשרת כתיבה במיקום זה כל עוד אין נתונים קיימים.
".write": "!data.exists()"
getPriority()
מקבל את העדיפות של הנתונים בתמונת RuleDataSnapshot .
ערך החזרה : ( String
, Number
, Null
) - העדיפות של הנתונים ב- RuleDataSnapshot זה.
דוגמה זו מבטיחה שלנתונים החדשים הנכתבים יש עדיפות
".validate": "newData.getPriority() != null"
isNumber()
מחזירה true אם RuleDataSnapshot זה מכיל ערך מספרי.
ערך החזרה : Boolean
- true
אם הנתונים הם מספריים; אחרת false
.
דוגמה זו מבטיחה שלנתונים החדשים שנכתבים יש "גיל" בן עם ערך מספרי.
".validate": "newData.child('age').isNumber()"
isString()
מחזירה true אם RuleDataSnapshot זה מכיל ערך מחרוזת.
ערך החזרה : Boolean
- true
אם הנתונים הם String
; אחרת false
.
דוגמה זו מבטיחה שלנתונים החדשים הנכתבים יש "שם" בן עם ערך מחרוזת.
".validate": "newData.child('name').isString()
isBoolean()
מחזירה true אם RuleDataSnapshot זה מכיל ערך בוליאני.
ערך החזרה : Boolean
- true
אם הנתונים הם Boolean
; אחרת false
.
דוגמה זו מבטיחה שלנתונים החדשים שנכתבים יש ילד "פעיל" עם ערך בוליאני.
".validate": "newData.child('active').isBoolean()"
מחרוזת: מאפיינים
אורך
מחזירה את אורך המחרוזת.
ערך החזרה : Number
- מספר התווים במחרוזת.
דוגמה זו דורשת שהמחרוזת תהיה בת 10 תווים לפחות.
".validate": "newData.isString() && newData.val().length >= 10"
מחרוזת: שיטות
מכיל (מחרוזת משנה)
מחזירה true אם המחרוזת מכילה את המחרוזת המשנה שצוינה.
ארגומנטים : substring
String
מחרוזת משנה שצריך לחפש.
Return Value : Boolean
- true
אם המחרוזת מכילה את המחרוזת המשנה שצוינה; אחרת false
.
דוגמה זו דורשת שהנתונים יהיו מחרוזת המכילה "@".
".validate": "newData.isString() && newData.val().contains('@')"
beginsWith(מחרוזת משנה)
מחזירה true אם המחרוזת מתחילה במחרוזת המשנה שצוינה.
ארגומנטים : substring
String
מחרוזת משנה שיש לחפש בהתחלה.
Return Value : Boolean
- true
אם המחרוזת מכילה את המחרוזת המשנה שצוינה; אחרת false
.
דוגמה זו מאפשרת גישת קריאה אם auth.token.identifier
מתחיל ב-"internal-"
".read": "auth.token.identifier.beginsWith('internal-')"
endsWith(מחרוזת משנה)
מחזירה true אם המחרוזת מסתיימת במחרוזת המשנה שצוינה.
ארגומנטים : substring
String
- תת מחרוזת לחפש בסוף.
Return Value : Boolean
- true
אם המחרוזת מסתיימת במחרוזת המשנה שצוינה; אחרת false
.
דוגמה זו מאפשרת גישת קריאה אם auth.token.identifier
מסתיים ב-"@company.com"
".read": "auth.token.identifier.endsWith('@company.com')"
replace(מחרוזת משנה, החלפה)
מחזירה עותק של המחרוזת עם כל המופעים של מחרוזת משנה שצוינה מוחלפת במחרוזת ההחלפה שצוינה.
ארגומנטים : substring String
- מחרוזת משנה שצריך לחפש. replacement String
- מחרוזת להחלפת המחרוזת המשנה בה.
Return Value : String
- המחרוזת החדשה לאחר החלפת המחרוזת המשנה בהחלפה.
השיטה replace()
שונה במקצת מהשיטה של JavaScript replace()
בכך שהיא מחליפה את כל המופעים של מחרוזת משנה שצוינה במחרוזת ההחלפה שצוינה, לא רק במופע הראשון.
מכיוון שאסור להשתמש בנקודות במפתחות, עלינו לברוח מחרוזות עם נקודות לפני אחסנה. דוגמה לכך תהיה עם כתובות דוא"ל. נניח שהייתה לנו רשימה של כתובות אימייל ברשימת ההיתרים בצומת /whitelist/
שלנו:
{
"user": {
"$uid": {
"email": <email>
}
},
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
}
אנו יכולים ליצור כלל שמאפשר להוסיף משתמשים רק אם הדוא"ל שלהם נמצא בצומת /whitelist/
:
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
}
}
}
}
toLowerCase()
מחזירה עותק של המחרוזת שהומרה לאותיות קטנות.
ערך החזרה : String
- המחרוזת המומרת לאותיות קטנות.
דוגמה זו מאפשרת גישת קריאה אם auth.token.identifier
שכן כל האותיות הקטנות קיימת תחת /users
.
".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"
toUpperCase()
מחזיר עותק של המחרוזת שהומר לאותיות רישיות.
ערך החזרה : String
- המחרוזת המומרת לאותיות גדולות.
דוגמה זו מאפשרת גישת קריאה אם auth.token.identifier
שכן כל האותיות הגדולות קיימת תחת /users
.
".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"
התאמות (רגקס)
מחזירה true אם המחרוזת תואמת את הביטוי הרגולרי שצוין.
Return Value : Boolean
- true
אם המחרוזת תואמת לביטוי הרגולרי ליטרלי, regex; אחרת false
.
ראה את התיעוד המלא של כללים רגולריים .
מפעילים
+ (הוסף)
משמש להוספת משתנים או לשרשור מחרוזות.
הדוגמה הבאה מבטיחה שהערך החדש מגדיל את הערך הקיים באחד בדיוק. זה שימושי ליישום מונה:
".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"
- (שלילה או הפחתה)
משמש כדי לשלול ערך או להחסיר שני ערכים בביטוי כללים.
כלל אימות זה בודק שהערך החדש הוא היפוך של ערך צאצא במיקום:
".validate": "newData.val() === -(data.child('quantity').val())"
הדוגמה הבאה משתמשת בחיסור כדי להבטיח שניתן לקרוא רק הודעות מעשר הדקות האחרונות:
".read": "newData.child('timestamp').val() > (now - 600000)"
* (להכפיל)
משמש להכפלת משתנים בביטוי כללים.
כלל אימות זה בודק אם הערך החדש שווה למוצר של מחיר וכמות (שני ערכים קיימים):
".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"
/ (לחלק)
משמש לחלוקת משתנים בביטוי כללים.
בדוגמה הבאה, כלל האימות מוודא שהנתונים המאוחסנים הם הממוצע של סך הנתונים המאוחסנים במקום אחר:
".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"
% (מודול)
משמש למציאת יתרת חלוקת משתנה אחד באחר בביטוי כללים.
כלל זה מאמת שניתן לכתוב רק מספרים זוגיים:
".validate": "newData.val() % 2 === 0"
=== (שווה)
משמש כדי לבדוק אם לשני משתנים בביטוי כללים יש אותו סוג וערך.
הכלל הבא משתמש באופרטור === כדי להעניק גישת כתיבה רק לבעלים של חשבון המשתמש. ה-uid של המשתמש חייב להתאים בדיוק למפתח ( $user_id
) כדי שהכלל יוערך כ-true.
"users": {
".write": "$user_id === auth.uid"
}
!== (לא שווה)
משמש כדי לבדוק אם שני משתנים בביטוי כללים אינם שווים.
כלל הקריאה הבא מבטיח שרק משתמשים מחוברים יכולים לקרוא נתונים:
".read": "auth !== null"
&& (ו)
מוערך כאמת אם שני האופרנדים נכונים. משמש להערכת תנאים מרובים בביטוי כללים.
כלל האימות הבא בודק שהנתונים החדשים הם מחרוזת בת פחות מ-100 תווים:
".validate": "newData.isString() && newData.val().length < 100"
|| (אוֹ)
מוערך כאמת אם אופרנד אחד בביטוי הכללים נכון.
בדוגמה זו, אנו יכולים לכתוב כל עוד נתונים ישנים או נתונים חדשים אינם קיימים. במילים אחרות, אנחנו יכולים לכתוב אם אנחנו מוחקים או יוצרים נתונים, אבל לא מעדכנים נתונים.
".write": "!data.exists() || !newData.exists()"
! (לֹא)
מוערך כאמת אם האופרנד היחיד שלו הוא שקר. בביטויי כללים, ה! לעתים קרובות נעשה שימוש באופרטור כדי לראות אם נתונים נכתבו למיקום מסוים.
הכלל הבא מאפשר גישת כתיבה רק אם אין נתונים במיקום שצוין:
".write": "!data.exists()"
> (גדול מ)
משמש כדי לבדוק אם ערך גדול מערך אחר בביטוי כללים.
כלל אימות זה בודק שהמחרוזת הנכתבת אינה מחרוזת ריקה:
".validate": "newData.isString() && newData.val().length > 0"
< (פחות מ)
משמש כדי לבדוק אם ערך קטן מערך אחר בביטוי כללים.
כלל אימות זה בודק שמחרוזת היא פחות מ-20 תווים:
".validate": "newData.isString() && newData.val().length < 20"
>= (גדול או שווה ל)
משמש כדי לבדוק אם ערך גדול או שווה לערך אחר בביטוי כללים.
כלל אימות זה בודק שהמחרוזת הנכתבת אינה מחרוזת ריקה:
".validate": "newData.isString() && newData.val().length >= 1"
<= (פחות או שווה ל)
משמש כדי לבדוק אם ערך קטן או שווה לערך אחר בביטוי כללים.
כלל אימות זה מבטיח שלא ניתן להוסיף נתונים חדשים בעתיד:
".validate": "newData.val() <= now"
? (אופרטור טרירי)
משמש להערכת ביטוי כללים מותנה.
האופרטור השלישוני לוקח שלושה אופרנדים. האופרנד לפני ה? הוא התנאי. אם התנאי מוערך כ-true, האופרנד השני מוערך. אם התנאי שקרי, האופרנד השלישי מוערך.
עבור כלל האימות הבא, הערך החדש יכול להיות מספר או בוליאני. אם זה מספר, הוא חייב להיות גדול מ-0.
".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"