Firebase Database Security Rules API

قاعده: انواع

.خواندن

به یک مشتری دسترسی خواندن به مکان پایگاه داده بیدرنگ Firebase را می دهد.

یک قانون .read نوعی قانون امنیتی است که به یک کلاینت دسترسی خواندن به مکان پایگاه داده بیدرنگ Firebase را می دهد. مثلا:

 ".read": "auth != null && auth.provider == 'twitter'"

مقدار یک قانون .read یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود. یک قانون .read که اجازه خواندن یک مکان را می دهد، همچنین اجازه خواندن هر یک از فرزندان آن مکان را می دهد، حتی اگر فرزندان قوانین .read خود را داشته باشند که با شکست مواجه شوند.

یک قانون .read به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase به جز newData دسترسی دارد.

.نوشتن

به یک مشتری دسترسی نوشتن به مکان پایگاه داده بیدرنگ Firebase را می دهد.

یک قانون .write نوعی قانون امنیتی است که به مشتری دسترسی نوشتن به یک مکان پایگاه داده بیدرنگ Firebase را می دهد. مثلا:

".write": "auth != null && auth.token.isAdmin == true"

مقدار یک قانون .write یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود. یک قانون .write که اجازه نوشتن در یک مکان را می دهد، همچنین اجازه نوشتن به هر نوادگان آن مکان را می دهد، حتی اگر فرزندان قوانین .write خود را داشته باشند که با شکست مواجه شوند.

یک قانون .write به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase دسترسی دارد.

.تایید اعتبار

زمانی استفاده می‌شود که یک قانون .write دسترسی داشته باشد تا اطمینان حاصل شود که داده‌های نوشته شده با یک طرح خاص مطابقت دارند.

یک قانون .validate زمانی استفاده می شود که به یک قانون .write .دسترسی داده شود تا اطمینان حاصل شود که داده های نوشته شده با استاندارد خاصی مطابقت دارند. علاوه بر اعطای دسترسی .write ، قبل از مجاز شدن نوشتن، همه قوانین .validate . مثلا:

".validate": "newData.hasChildren(['name', 'age'])"

مقدار یک قانون .validate یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود.

یک قانون .validate به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase دسترسی دارد.

.indexOn

عملکرد پرس و جو را با گفتن به پایگاه داده بیدرنگ Firebase بهبود می بخشد.

قانون .indexOn به سرورهای پایگاه داده بیدرنگ Firebase می‌گوید که کلیدهای خاصی را در داده‌های شما فهرست کنند تا عملکرد جستارهای شما را بهبود بخشند. به عنوان مثال، با توجه به یک پایگاه داده با مجموعه ای از داده های دایناسورها، می توانیم به Firebase Realtime Database برای بهینه سازی پرس و جوها، قبل از اینکه از سرورها برگردانده شوند، با افزودن این قانون بگوییم:

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

می توانید با مراجعه به بخش راهنمای امنیتی در مورد نمایه سازی داده های خود، اطلاعات بیشتری در مورد قانون .indexOn کسب کنید.

قانون: متغیرها

اعتبار

متغیری که حاوی بار توکن است اگر کلاینت احراز هویت شده باشد، یا اگر کلاینت احراز هویت نشده باشد، null .

پایگاه داده بیدرنگ Firebase به شما این امکان را می دهد که به راحتی در چندین ارائه دهنده داخلی احراز هویت کنید و توکن های احراز هویت را برای آنها ایجاد کنید. پس از احراز هویت کاربر با یکی از ارائه دهندگان داخلی، متغیر auth شامل موارد زیر خواهد بود:

رشته شرح
provider روش احراز هویت مورد استفاده (به عنوان مثال "رمز عبور"، "ناشناس"، "فیس بوک"، "github"، "google"، یا "twitter").
uid یک شناسه کاربری منحصر به فرد، تضمین شده است که در همه ارائه دهندگان منحصر به فرد است.
token محتویات کد Firebase Auth ID. auth.token ببینید.

به عنوان مثال، می‌توانیم قانونی مانند زیر داشته باشیم که به کاربران اجازه می‌دهد تا زمانی که شناسه کاربری خود را با نظر ذخیره می‌کنند، نظر ایجاد کنند:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

همچنین می‌توانیم قاعده‌ای مانند زیر ایجاد کنیم تا کاربران بتوانند نظرات خود را تا زمانی که با استفاده از فیس‌بوک وارد شده‌اند ایجاد کنند:

{
  "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 شناسه مستاجر مرتبط با حساب، در صورت وجود. به عنوان مثال 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 در ساختار قوانین خود دارید، می توانید از یک متغیر مطابق با $ در عبارت قانون خود استفاده کنید تا نام فرزند واقعی خوانده یا نوشته شده را بدست آورید. بنابراین فرض کنید می‌خواهیم به هر کاربر دسترسی خواندن و نوشتن به مکان /users/<user> خودش را بدهیم. می توانستیم استفاده کنیم:

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

وقتی مشتری سعی می کند /users/barney دسترسی پیدا کند، مکان پیش فرض $user با $user برابر با "barney" مطابقت دارد. بنابراین قانون .read بررسی خواهد کرد که آیا auth.uid === 'barney' . در نتیجه، خواندن /users/barney تنها در صورتی موفق خواهد شد که کلاینت با uid "barney" احراز هویت شود.

اکنون

شامل تعداد میلی ثانیه از زمان یونیکس طبق سرورهای پایگاه داده بیدرنگ Firebase است.

متغیر now بر اساس سرورهای پایگاه داده بیدرنگ Firebase حاوی تعداد میلی ثانیه از زمان یونیکس است. به عنوان مثال، می توانید از این برای تأیید اینکه زمان created توسط کاربر هرگز در آینده روی زمانی تنظیم نمی شود استفاده کنید:

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

ریشه

یک RuleDataSnapshot مربوط به داده های فعلی در ریشه پایگاه داده بیدرنگ Firebase شما.

متغیر root به شما یک 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 در محل قانون در حال اجرا.

متغیر داده به شما یک RuleDataSnapshot مربوط به داده های فعلی در محل پایگاه داده قانون در حال اجرا را می دهد (برخلاف root، که داده های ریشه پایگاه داده شما را به شما می دهد).

به عنوان مثال، اگر می‌خواهید به هر کلاینت اجازه دسترسی به /users/<user> را بدهید اگر /users/<user>/public روی true تنظیم شده بود، می‌توانید استفاده کنید:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

متغیر داده در قوانین .read ، .write و .validate موجود است.

داده های جدید

یک RuleDataSnapshot مربوط به داده‌هایی که در صورت مجاز بودن نوشتن به دست می‌آید.

برای قوانین .write و .validate بنابراین اگر می‌خواهید مطمئن شوید که هر کاربر یک نام و سن دارد، می‌توانید از موارد زیر استفاده کنید:

{
  "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 برای مکان فرزند.

مسیر نسبی می تواند یک نام ساده فرزند باشد (مثلاً "فرد") یا یک مسیر جدا شده با اسلش عمیق تر (مثلا "فرد/نام/اول"). اگر مکان فرزند داده ای نداشته باشد، یک RuleDataSnapshot خالی برگردانده می شود.

این مثال فقط در صورتی اجازه خواندن را می دهد که فرزند isReadable در مکان خوانده شده روی true تنظیم شده باشد.

".read": "data.child('isReadable').val() == true"

والدین()

یک RuleDataSnapshot برای مکان والد دریافت می کند.

مقدار بازگشتی : RuleDataSnapshot - RuleDataSnapshot برای مکان والد.

اگر این نمونه به ریشه پایگاه داده بیدرنگ Firebase شما اشاره داشته باشد، هیچ پدر و مادری ندارد و parent() از کار می افتد و باعث می شود که عبارت قانون فعلی نادیده گرفته شود (به عنوان یک شکست).

این مثال فقط در صورتی اجازه خواندن را می دهد که خواهر و برادر isReadable روی true تنظیم شده باشد.

".read": "data.parent().child('isReadable').val() == true"

hasChild (childPath)

اگر فرزند مشخص شده وجود داشته باشد، true را برمی گرداند.

Arguments : childPath String - یک مسیر نسبی به مکان یک فرزند بالقوه.

مقدار بازگشتی : Boolean - true اگر داده در مسیر فرزند مشخص شده وجود داشته باشد. دیگر false .

این مثال فقط در صورتی اجازه می دهد که داده ها حاوی "نام" فرزند باشند.

".validate": "newData.hasChild('name')"

دارای فرزندان ([فرزندان])

وجود فرزندان را بررسی می کند.

آرگومان ها : Array children اختیاری - آرایه ای از کلیدهای فرزند که همه باید وجود داشته باشند.

مقدار بازگشتی : Boolean - اگر فرزندان (مشخص شده) وجود داشته باشند true . دیگر false .

اگر هیچ آرگومان ارائه نشود، اگر RuleDataSnapshot فرزندانی داشته باشد، مقدار true برمی گردد. اگر آرایه‌ای از نام‌های فرزند ارائه شود، تنها در صورتی درست برمی‌گردد که همه فرزندان مشخص‌شده در RuleDataSnapshot وجود داشته باشند.

این مثال فقط در صورتی اجازه می دهد که داده ها حاوی یک یا چند فرزند باشند.

".validate": "newData.hasChildren()"

این مثال فقط در صورتی اجازه می دهد که داده ها حاوی فرزندان "نام" و "سن" باشند.

".validate": "newData.hasChildren(['name', 'age'])"

وجود دارد()

اگر این RuleDataSnapshot حاوی داده‌ای باشد، true برمی‌گرداند.

مقدار بازگشتی : Boolean - اگر RuleDataSnapshot حاوی داده‌ای باشد true . دیگر false .

اگر این RuleDataSnapshot حاوی داده ای باشد، تابع exists true را برمی گرداند. این صرفاً یک تابع راحت است زیرا data.exists() معادل data.val() != null است.

این مثال امکان نوشتن در این مکان را تا زمانی که داده‌های موجود وجود ندارد، می‌دهد.

".write": "!data.exists()"

getPriority()

اولویت داده ها را در یک RuleDataSnapshot دریافت می کند.

مقدار بازگشتی : ( String ، Number ، Null ) - اولویت داده ها در این RuleDataSnapshot .

این مثال تضمین می کند که داده های جدید در حال نوشتن دارای اولویت هستند

".validate": "newData.getPriority() != null"

isNumber()

اگر این RuleDataSnapshot حاوی یک مقدار عددی باشد، مقدار true را برمی‌گرداند.

مقدار بازگشتی : Boolean - اگر داده ها عددی باشند true . دیگر false .

این مثال تضمین می کند که داده های جدید نوشته شده دارای "سن" فرزند با مقدار عددی هستند.

".validate": "newData.child('age').isNumber()"

isString()

اگر این RuleDataSnapshot حاوی یک مقدار رشته باشد، مقدار true را برمی‌گرداند.

مقدار بازگشتی : Boolean - true اگر داده یک String باشد. دیگر false .

این مثال تضمین می‌کند که داده‌های جدید نوشته شده دارای «نام» فرزند با مقدار رشته هستند.

".validate": "newData.child('name').isString()

isBoolean()

اگر این RuleDataSnapshot حاوی مقدار بولی باشد، مقدار true را برمی‌گرداند.

مقدار برگشتی : Boolean - true اگر داده ها Boolean باشند. دیگر false .

این مثال تضمین می کند که داده های جدید نوشته شده دارای فرزند "اکتیو" با مقدار بولی هستند.

".validate": "newData.child('active').isBoolean()"

رشته: خواص

طول

طول رشته را برمی گرداند.

مقدار بازگشتی : Number - تعداد کاراکترهای رشته.

این مثال مستلزم داشتن رشته حداقل 10 کاراکتر است.

".validate": "newData.isString() && newData.val().length >= 10"

رشته: روش ها

حاوی (زیر رشته)

اگر رشته حاوی زیررشته مشخص شده باشد، مقدار true را برمی گرداند.

Arguments : substring String - رشته فرعی که باید جستجو کرد.

مقدار بازگشتی : Boolean - اگر رشته حاوی زیررشته مشخص شده باشد true . دیگر false .

این مثال نیاز دارد که داده‌ها رشته‌ای حاوی «@» باشند.

".validate": "newData.isString() && newData.val().contains('@')"

با (زیر رشته) شروع می شود

اگر رشته با رشته فرعی مشخص شده شروع شود مقدار true را برمی گرداند.

Arguments : substring String - رشته فرعی که در ابتدا باید به دنبال آن باشید.

مقدار بازگشتی : Boolean - اگر رشته حاوی زیررشته مشخص شده باشد true . دیگر false .

اگر auth.token.identifier با "internal-" شروع شود، این مثال اجازه دسترسی به خواندن را می دهد.

".read": "auth.token.identifier.beginsWith('internal-')"

endsWith (زیر رشته)

اگر رشته با رشته فرعی مشخص شده خاتمه یابد مقدار true را برمی گرداند.

Arguments : substring String - رشته فرعی که در انتها باید به دنبال آن بگردید.

مقدار بازگشتی : Boolean - true اگر رشته به زیر رشته مشخص شده ختم شود. دیگر false .

اگر auth.token.identifier به "@company.com" ختم شود، این مثال اجازه دسترسی به خواندن را می دهد.

".read": "auth.token.identifier.endsWith('@company.com')"

جایگزینی (زیر رشته، جایگزینی)

یک کپی از رشته را با تمام نمونه های یک رشته فرعی مشخص شده با رشته جایگزین مشخص شده جایگزین می کند.

Arguments : substring String - رشته فرعی که باید جستجو کرد. replacement String - رشته ای برای جایگزینی رشته فرعی.

مقدار بازگشتی : String - رشته جدید پس از جایگزینی رشته فرعی با جایگزین.

متد replace() با متد 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()"

کبریت (regex)

اگر رشته با عبارت منظم تعیین شده مطابقت داشته باشد، مقدار true را برمی گرداند.

مقدار بازگشتی : Boolean - true اگر رشته با عبارت منظم literal، regex مطابقت داشته باشد. دیگر false .

مستندات کامل قوانین regex را ببینید.

اپراتورها

+ (افزودن)

برای افزودن متغیرها یا برای الحاق رشته ها استفاده می شود.

مثال زیر تضمین می کند که مقدار جدید مقدار موجود را دقیقاً یک عدد افزایش می دهد. این برای پیاده سازی شمارنده مفید است:

".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 ) مطابقت داشته باشد تا قانون به درستی ارزیابی شود.

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

!== (برابر نیست)

برای بررسی اینکه آیا دو متغیر در یک عبارت قوانین برابر نیستند یا خیر استفاده می شود.

قانون خواندن زیر تضمین می کند که فقط کاربرانی که وارد سیستم شده اند می توانند داده ها را بخوانند:

".read": "auth !== null"

&& (AND)

اگر هر دو عملوند درست باشند، به true ارزیابی می شود. برای ارزیابی شرایط چندگانه در یک عبارت قوانین استفاده می شود.

قانون اعتبارسنجی زیر بررسی می‌کند که داده‌های جدید رشته‌ای کمتر از 100 کاراکتر باشند:

".validate": "newData.isString() && newData.val().length < 100"

|| (یا)

اگر یک عملوند در عبارت قواعد درست باشد، به true ارزیابی می کند.

در این مثال، تا زمانی که داده های قدیمی یا جدید وجود نداشته باشند، می توانیم بنویسیم. به عبارت دیگر، اگر در حال حذف یا ایجاد داده هستیم، اما داده ها را به روز نمی کنیم، می توانیم بنویسیم.

".write": "!data.exists() || !newData.exists()"

! (نه)

اگر عملوند منفرد آن نادرست باشد به true ارزیابی می کند. در عبارات قواعد، ! عملگر اغلب برای مشاهده اینکه آیا داده ها در یک مکان نوشته شده اند یا خیر استفاده می شود.

قانون زیر فقط در صورتی اجازه دسترسی به نوشتن را می دهد که هیچ داده ای در مکان مشخص شده وجود نداشته باشد:

".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"

? (اپراتور سه تایی)

برای ارزیابی یک عبارت قوانین شرطی استفاده می شود.

عملگر سه تایی سه عملوند می گیرد. عملوند قبل از ? شرط است. اگر شرط به درستی ارزیابی شود، عملوند دوم ارزیابی می شود. اگر شرط نادرست باشد، عملوند سوم ارزیابی می شود.

برای قانون اعتبارسنجی زیر، مقدار جدید می تواند یک عدد یا یک بولی باشد. اگر عدد است، باید بزرگتر از 0 باشد.

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"