قوانین امنیتی پایگاه داده بیدرنگ Firebase را بدانید

قوانین امنیتی پایگاه داده بلادرنگ Firebase تعیین می‌کنند که چه کسی به پایگاه داده شما دسترسی خواندن و نوشتن دارد، داده‌های شما چگونه ساختار یافته‌اند و چه شاخص‌هایی وجود دارند. این قوانین روی سرورهای Firebase قرار دارند و همیشه به طور خودکار اجرا می‌شوند. هر درخواست خواندن و نوشتن فقط در صورتی انجام می‌شود که قوانین شما اجازه دهند. به طور پیش‌فرض، قوانین شما به هیچ کس اجازه دسترسی به پایگاه داده شما را نمی‌دهند. این کار برای محافظت از پایگاه داده شما در برابر سوءاستفاده تا زمانی است که وقت داشته باشید قوانین خود را سفارشی کنید یا احراز هویت را تنظیم کنید.

قوانین امنیتی پایگاه داده بلادرنگ (Realtime Database Security Rules) سینتکسی شبیه به جاوا اسکریپت دارند و در چهار نوع ارائه می‌شوند:

انواع قوانین
.خواندن شرح می‌دهد که آیا و چه زمانی کاربران اجازه خواندن داده‌ها را دارند.
.نوشتن شرح می‌دهد که آیا و چه زمانی اجازه نوشتن داده‌ها وجود دارد.
اعتبارسنجی تعریف می‌کند که یک مقدار با قالب‌بندی صحیح چگونه خواهد بود، آیا دارای ویژگی‌های فرزند است یا خیر، و نوع داده را نیز مشخص می‌کند.
.indexOn یک فرزند را برای فهرست‌بندی جهت پشتیبانی از مرتب‌سازی و پرس‌وجو مشخص می‌کند.

بررسی اجمالی امنیت Realtime Database

Firebase Realtime Database مجموعه‌ای کامل از ابزارها را برای مدیریت امنیت برنامه‌ی شما فراهم می‌کند. این ابزارها، احراز هویت کاربران، اعمال مجوزهای کاربر و اعتبارسنجی ورودی‌ها را آسان می‌کنند.

برنامه‌های مبتنی بر Firebase نسبت به برنامه‌های مبتنی بر بسیاری از فناوری‌های دیگر، کد سمت کلاینت بیشتری اجرا می‌کنند. بنابراین، رویکرد ما به امنیت ممکن است کمی متفاوت از آن چیزی باشد که شما به آن عادت دارید.

احراز هویت

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

هویت کاربر یک مفهوم امنیتی مهم است. کاربران مختلف، داده‌های متفاوتی دارند و گاهی اوقات قابلیت‌های متفاوتی نیز دارند. برای مثال، در یک برنامه چت، هر پیام با کاربری که آن را ایجاد کرده است مرتبط است. کاربران همچنین ممکن است بتوانند پیام‌های خود را حذف کنند، اما نمی‌توانند پیام‌های ارسال شده توسط سایر کاربران را حذف کنند.

مجوز

شناسایی کاربر شما تنها بخشی از امنیت است. هنگامی که شما می‌دانید آنها چه کسانی هستند، به روشی برای کنترل دسترسی آنها به داده‌های پایگاه داده خود نیاز دارید. قوانین امنیتی پایگاه داده بلادرنگ به شما امکان می‌دهند دسترسی هر کاربر را کنترل کنید. به عنوان مثال، در اینجا مجموعه‌ای از قوانین امنیتی وجود دارد که به هر کسی اجازه می‌دهد مسیر /foo/ را بخواند، اما هیچ کس نمی‌تواند در آن بنویسد:

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

قوانین .read و .write به صورت آبشاری عمل می‌کنند، بنابراین این مجموعه قوانین، دسترسی خواندن به هر داده‌ای در مسیر /foo/ و همچنین هر مسیر عمیق‌تری مانند /foo/bar/baz را اعطا می‌کند. توجه داشته باشید که قوانین .read و .write که در پایگاه داده سطحی‌تر هستند، قوانین عمیق‌تر را لغو می‌کنند، بنابراین دسترسی خواندن به /foo/bar/baz ‎ در این مثال همچنان اعطا می‌شود، حتی اگر یک قانون در مسیر /foo/bar/baz به صورت نادرست ارزیابی شود.

قوانین امنیتی پایگاه داده بلادرنگ شامل متغیرها و توابع داخلی هستند که به شما امکان می‌دهند به مسیرهای دیگر، مهرهای زمانی سمت سرور، اطلاعات احراز هویت و موارد دیگر مراجعه کنید. در اینجا مثالی از قانونی آورده شده است که دسترسی نوشتن را برای کاربران احراز هویت شده در /users/<uid>/ اعطا می‌کند، که <uid> شناسه کاربری است که از طریق Firebase Authentication به دست آمده است.

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

اعتبارسنجی داده‌ها

Firebase Realtime Database بدون طرح است. این امر تغییر موارد را در حین توسعه آسان می‌کند، اما هنگامی که برنامه شما آماده توزیع شد، مهم است که داده‌ها ثابت بمانند. زبان قوانین شامل یک قانون .validate است که به شما امکان می‌دهد منطق اعتبارسنجی را با استفاده از همان عباراتی که برای قوانین .read و .write استفاده می‌شود، اعمال کنید. تنها تفاوت این است که قوانین اعتبارسنجی آبشاری نیستند ، بنابراین همه قوانین اعتبارسنجی مربوطه باید به صورت درست ارزیابی شوند تا نوشتن مجاز باشد.

این قوانین الزام می‌کنند که داده‌های نوشته شده در /foo/ باید رشته‌ای کمتر از ۱۰۰ کاراکتر باشند:

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

قوانین اعتبارسنجی به تمام توابع و متغیرهای داخلی مشابه قوانین .read و .write دسترسی دارند. می‌توانید از این موارد برای ایجاد قوانین اعتبارسنجی استفاده کنید که از داده‌های موجود در جای دیگری از پایگاه داده، هویت کاربر، زمان سرور و موارد دیگر آگاه هستند.

تعریف ایندکس‌های پایگاه داده

Firebase Realtime Database امکان مرتب‌سازی و پرس‌وجوی داده‌ها را فراهم می‌کند. برای داده‌های با اندازه کوچک، این پایگاه داده از پرس‌وجوی موقت پشتیبانی می‌کند، بنابراین معمولاً در طول توسعه نیازی به ایندکس نیست. با این حال، قبل از راه‌اندازی برنامه، مهم است که برای هر پرس‌وجویی که دارید، ایندکس تعیین کنید تا مطمئن شوید که با رشد برنامه، ایندکس‌ها همچنان کار می‌کنند.

اندیس‌ها با استفاده از قانون .indexOn ‎ مشخص می‌شوند. در اینجا یک مثال از تعریف اندیس آمده است که فیلدهای ارتفاع و طول را برای لیستی از دایناسورها اندیس‌گذاری می‌کند:

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

مراحل بعدی