قوانین ناامن را اصلاح کنید

از این راهنما برای درک آسیب‌پذیری‌های رایج در پیکربندی‌های Cloud Firestore Security Rules ، بررسی و ایمن‌تر کردن قوانین خود و آزمایش تغییرات خود قبل از استقرار آنها استفاده کنید.

اگر هشداری دریافت کردید که پایگاه داده Cloud Firestore شما به درستی ایمن نشده است، می‌توانید با اصلاح و آزمایش Cloud Firestore Security Rules آسیب‌پذیری‌ها را برطرف کنید.

برای مشاهده قوانین امنیتی موجود خود، به تب قوانین در کنسول Firebase بروید.

Cloud Firestore Security Rules خود را درک کنید

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

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

سناریوهای رایج با قوانین ناامن

Cloud Firestore Security Rules که ممکن است به‌طور پیش‌فرض تنظیم کرده باشید یا همانطور که در ابتدا روی توسعه برنامه خود با Cloud Firestore کار می‌کردید، باید قبل از استقرار برنامه خود بررسی و به‌روزرسانی شوند. با اجتناب از مشکلات رایج زیر، مطمئن شوید که به درستی داده های کاربران خود را ایمن می کنید.

دسترسی را باز کنید

همانطور که Cloud Firestore راه‌اندازی می‌کنید، ممکن است قوانین خود را طوری تنظیم کرده باشید که اجازه دسترسی آزاد را در طول توسعه بدهید. ممکن است فکر کنید تنها فردی هستید که از برنامه خود استفاده می کنید، اما اگر آن را اجرا کرده اید، در اینترنت در دسترس است. اگر کاربران را احراز هویت نمی کنید و قوانین امنیتی را پیکربندی نمی کنید، هر کسی که ID پروژه شما را حدس بزند می تواند داده ها را بدزدد، تغییر دهد یا حذف کند.

توصیه نمی شود: دسترسی خواندن و نوشتن برای همه کاربران.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
راه حل: قوانینی که دسترسی خواندن و نوشتن را محدود می کند.

قوانینی بسازید که برای سلسله مراتب داده های شما منطقی باشد. یکی از راه حل های رایج برای این ناامنی، امنیت مبتنی بر کاربر با Firebase Authentication است. درباره احراز هویت کاربران با قوانین بیشتر بیاموزید.

فقط صاحب محتوا

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      // Allow reads and deletion if the current user owns the existing document
      allow read, delete: if request.auth.uid == resource.data.author_uid;
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;

    }
  }
}
  

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

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      // Allow public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}
  

دسترسی برای هر کاربر تایید شده

گاهی اوقات، Cloud Firestore Security Rules بررسی می‌کنند که کاربر وارد سیستم شده است، اما دسترسی را براساس آن احراز هویت محدود نمی‌کند. اگر یکی از قوانین شما شامل auth != null است، تأیید کنید که می‌خواهید هر کاربر وارد شده به داده‌ها دسترسی داشته باشد.

توصیه نمی شود: هر کاربری که وارد سیستم شده است به کل پایگاه داده شما دسترسی خواندن و نوشتن دارد.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
راه حل: دسترسی محدود با استفاده از شرایط امنیتی.

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

دسترسی مبتنی بر نقش

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

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

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

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

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 write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

دسترسی بسته

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

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK و توابع Cloud همچنان می توانند به پایگاه داده شما دسترسی داشته باشند. زمانی که قصد دارید از Cloud Firestore به عنوان پشتیبان فقط سرور در ارتباط با Firebase Admin SDK استفاده کنید، از این قوانین استفاده کنید. در حالی که ایمن است، باید آزمایش کنید که کلاینت های برنامه شما می توانند داده ها را به درستی بازیابی کنند.

درباره Cloud Firestore Security Rules و نحوه عملکرد آنها در Get Started with Cloud Firestore Security Rules بیشتر بیاموزید.

Cloud Firestore Security Rules خود را بررسی کنید

برای بررسی رفتار برنامه و تأیید پیکربندی‌های Cloud Firestore Security Rules ، از شبیه‌ساز Cloud Firestore استفاده کنید. قبل از اعمال هرگونه تغییر، از شبیه ساز Cloud Firestore برای اجرا و خودکارسازی تست های واحد در یک محیط محلی استفاده کنید.

برای آزمایش سریع Cloud Firestore Security Rules خود در کنسول Firebase، از ابزار Rules Playground استفاده کنید.

  1. برای باز کردن Rules Playground، روی Rules playground از برگه Rules کلیک کنید.
  2. در تنظیمات زمین بازی قوانین ، گزینه هایی را برای آزمایش خود انتخاب کنید، از جمله:
    • تست خواندن یا نوشتن
    • یک مکان خاص در پایگاه داده شما، به عنوان یک مسیر
    • نوع احراز هویت - کاربر ناشناس احراز هویت نشده، یا یک شناسه کاربری خاص
    • داده های خاص سندی که قوانین شما به طور خاص به آنها ارجاع می دهند (به عنوان مثال، اگر قوانین شما قبل از اجازه نوشتن به وجود یک فیلد خاص نیاز دارد)
  3. روی Run کلیک کنید و نتایج را در بنر بالای پنجره قوانین جستجو کنید.