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

از این راهنما برای درک آسیب‌پذیری‌های رایج در پیکربندی‌های 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 ، ممکن است قوانین خود را طوری تنظیم کرده باشید که در طول توسعه، دسترسی آزاد را مجاز بداند. ممکن است فکر کنید تنها کسی هستید که از برنامه خود استفاده می‌کنید، اما اگر آن را مستقر کرده‌اید، در اینترنت موجود است. اگر کاربران را احراز هویت نکنید و قوانین امنیتی را پیکربندی نکنید، هر کسی که شناسه پروژه شما را حدس بزند می‌تواند داده‌ها را بدزدد، تغییر دهد یا حذف کند.

توصیه نمی‌شود: دسترسی خواندن و نوشتن برای همه کاربران.
// 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
    }
  }
}
  

دسترسی به آدرس‌های ایمیل تأیید نشده

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

توصیه نمی‌شود: هر کاربری می‌تواند با یک آدرس ایمیل دلخواه وارد سیستم شود.
service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email.endsWith('@example.com')
    }
  }
}
راه حل: دسترسی محدود فقط به ایمیل‌های تأیید شده.

تأیید ایمیل‌ها

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email_verified
                 && request.auth.email.endsWith('@example.com')
    }
  }
}

دسترسی بسته

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

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

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

برای کسب اطلاعات بیشتر در مورد Cloud Firestore Security Rules و نحوه عملکرد آنها، به بخش « شروع به کار با Cloud Firestore Security Rules مراجعه کنید.

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

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

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

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