قوانین اساسی امنیتی

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

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

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

قوانین پیش فرض: حالت قفل شده

هنگامی که شما ایجاد یک پایگاه داده یا ذخیره سازی به عنوان مثال در فایربیس کنسول، شما انتخاب کنید که آیا فایربیس قوانین امنیتی خود را محدود کردن دسترسی به داده های خود را (در حالت قفل شده) و یا اجازه دسترسی هر کسی (حالت تست). در ابر Firestore و پایگاه بیدرنگ، قوانین به طور پیش فرض برای حالت قفل شده مانع از دسترسی به تمام کاربران. در Cloud Storage ، فقط کاربران تأیید شده می توانند به سطوح ذخیره سازی دسترسی داشته باشند.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

پایگاه داده بیدرنگ

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

فضای ذخیره ابری

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

قوانین توسعه-محیط

در حالی که روی برنامه خود کار می کنید ، ممکن است دسترسی نسبتاً باز یا بدون محدودیت به داده های خود را بخواهید. فقط مطمئن شوید قبل از اینکه برنامه خود را در مرحله تولید قرار دهید ، قوانین خود را به روز کنید. همچنین به یاد داشته باشید که اگر شما برنامه خود را استقرار، آن را در دسترس عموم - حتی اگر شما آن را راه اندازی نمی کند.

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

همه کاربران تأیید شده

در حالی که توصیه نمی کنیم داده های شما را در اختیار هر کاربری که وارد سیستم شده است بگذارید ، ممکن است هنگام ایجاد برنامه خود ، دسترسی به هر کاربر تأیید شده را تنظیم کنید.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

پایگاه داده بیدرنگ

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

فضای ذخیره ابری

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

قوانین آماده تولید

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

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

دسترسی فقط به مالک محتوا

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

هنگامی که این کار حکومت: این قانون به خوبی کار می کند اگر داده ها توسط کاربران siled - اگر تنها کاربری هستید که نیاز به دسترسی به داده ها از همان کاربر است که داده ایجاد شده است.

هنگامی که این قانون کار نمی کند: این مجموعه قوانین کار نمی کند زمانی که چند کاربر نیاز به خواندن و یا نوشتن داده های مشابه - کاربران داده های بازنویسی و یا قادر به دسترسی به داده ها آنها ایجاد کرده اید.

برای تنظیم این قانون: ایجاد یک قانون که تایید کاربر درخواست دسترسی به خواندن و یا نوشتن اطلاعات کاربر است که مالک آن داده است.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

پایگاه داده بیدرنگ

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth != null && auth.uid == $uid"
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

فضای ذخیره ابری

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

دسترسی مختلط عمومی و خصوصی

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

هنگامی که این قانون کار: این قانون خوبی کار می کند برای برنامه های که نیاز به عموم عناصر قابل خواندن است، اما نیاز به محدود کردن دسترسی ویرایش به صاحبان آن عناصر. به عنوان مثال ، یک برنامه چت یا وبلاگ.

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

برای تنظیم این قانون: ایجاد یک قانون که امکان دسترسی خواندن برای تمام کاربران (یا همه کاربران تصدیق شده)، و تایید نوشتن داده ها کاربران مالک است.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

پایگاه داده بیدرنگ

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid != null" for only authenticated users
        ".write": "auth.uid == $uid"
      }
    }
  }
}

فضای ذخیره ابری

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

دسترسی مبتنی بر ویژگی و مبتنی بر نقش

برای این که این قانون کار کند ، باید در داده های خود ویژگی هایی را به کاربران تعریف و اختصاص دهید. قوانین امنیتی Firebase برای تأیید یا عدم دسترسی ، درخواست را در برابر داده های پایگاه داده یا فراداده فایل شما بررسی می کند.

هنگامی که این قانون کار می کند: اگر شما در حال اختصاص دادن یک نقش را به کاربران، این قانون را آسان می کند به محدود کردن دسترسی بر اساس نقش و یا گروه خاصی از کاربران. به عنوان مثال ، اگر شما نمرات را ذخیره می کردید ، می توانید سطوح دسترسی متفاوتی را به گروه "دانش آموزان" (فقط مطالب آنها را بخوانید) ، گروه "معلمان" (در موضوع خود بخوانید و بنویسید) و گروه "مدیران" (بخوانید) اختصاص دهید. همه محتوا)

هنگامی که این قانون کار نمی کند: پایگاه در زمان واقعی و ذخیره سازی ابر، قوانین خود را می توانید اهرم نیست get() روش که قوانین ابر Firestore می توانید ترکیب. در نتیجه ، شما باید پایگاه داده یا فراداده فایل خود را ساختار دهید تا ویژگی هایی را که در قوانین خود استفاده می کنید منعکس کند.

برای تنظیم این قانون: در ابر Firestore، شامل یک میدان در اسناد کاربران خود را که شما می توانید به عنوان خوانده شده، پس از آن ساختار حکومت خود را به خواندن این زمینه و مشروط اجازه دسترسی دهید. در پایگاه داده Realtime ، یک مسیر داده ایجاد کنید که کاربران برنامه شما را مشخص کرده و به آنها نقش در یک گره کودک بدهد.

شما همچنین می توانید راه اندازی ادعاهای سفارشی در تایید و سپس بازیابی اطلاعات از auth.token متغیر در هر فایربیس قوانین امنیتی.

ویژگی ها و نقش های تعریف شده توسط داده ها

این قوانین فقط در Cloud Firestore و پایگاه داده Realtime کار می کند.

Cloud Firestore

به یاد داشته باشید که هر زمان که قوانین شما شامل خواندن می شوند ، مانند قوانین زیر ، هزینه عملیات خواندن در Cloud Firestore برای شما محاسبه می شود.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

پایگاه داده بیدرنگ

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
        ".read": true
      }
    }
  }
}

ویژگی ها و نقش های ادعای سفارشی

برای اجرای این قوانین، راه اندازی ادعاهای سفارشی در فایربیس احراز هویت و سپس اهرم ادعا در قوانین خود را.

Cloud Firestore

به یاد داشته باشید که هر زمان که قوانین شما شامل خواندن می شوند ، مانند قوانین زیر ، هزینه عملیات خواندن در Cloud Firestore برای شما محاسبه می شود.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

پایگاه داده بیدرنگ

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid != null && auth.token.writer == true",
        ".read": "auth.uid != null && auth.token.reader == true"
      }
    }
  }
}

فضای ذخیره ابری

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}