از قوانین ناامن اجتناب کنید

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

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

به Firebase Security Rules خود دسترسی پیدا کنید

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

برای دسترسی به قوانین خود از کنسول Firebase ، پروژه خود را انتخاب کنید، سپس به Realtime Database ، Cloud Firestore یا Storage بروید. وقتی در پایگاه داده یا مخزن ذخیره‌سازی صحیح قرار گرفتید، روی Rules کلیک کنید.

برای دسترسی به قوانین خود از طریق رابط خط فرمان Firebase ، به فایل قوانین ذکر شده در فایل firebase.json خود بروید.

درک Firebase Security Rules

Firebase Security Rules از داده‌های شما در برابر کاربران مخرب محافظت می‌کنند. وقتی یک نمونه پایگاه داده یا مخزن Cloud Storage را در کنسول Firebase ایجاد می‌کنید، می‌توانید دسترسی همه کاربران را مسدود کنید ( حالت قفل ) یا به همه کاربران دسترسی بدهید ( حالت آزمایشی ). اگرچه ممکن است در طول توسعه پیکربندی بازتری بخواهید، اما قبل از استقرار برنامه خود، مطمئن شوید که برای پیکربندی صحیح قوانین و ایمن‌سازی داده‌های خود وقت می‌گذارید.

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

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

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

دسترسی آزاد

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

توصیه نمی‌شود: دسترسی خواندن و نوشتن برای همه کاربران.

Cloud Firestore

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

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

Realtime Database

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

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

Cloud Storage

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded using App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
راه حل: قوانینی که دسترسی خواندن و نوشتن را محدود می‌کنند.

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

Cloud Firestore

Realtime Database

Cloud Storage

دسترسی برای هر کاربر احراز هویت شده

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

توصیه نمی‌شود: هر کاربر وارد شده به سیستم، دسترسی خواندن و نوشتن به کل پایگاه داده شما را دارد.

Cloud Firestore

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

Realtime Database

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

Cloud Storage

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
راه حل: محدود کردن دسترسی با استفاده از شرایط امنیتی.

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

Cloud Firestore

Realtime Database

Cloud Storage

( Realtime Database ) قوانین به طور نادرست به ارث رسیده‌اند

Realtime Database Security Rules آبشاری اجرا می‌شوند، به طوری که قوانین در مسیرهای والد کم‌عمق‌تر، قوانین موجود در گره‌های فرزند عمیق‌تر را لغو می‌کنند. وقتی قانونی را در یک گره فرزند می‌نویسید، به یاد داشته باشید که فقط می‌تواند امتیازات اضافی اعطا کند. شما نمی‌توانید دسترسی به داده‌ها را در مسیرهای عمیق‌تر در پایگاه داده خود اصلاح یا لغو کنید.

توصیه نمی‌شود: اصلاح قوانین در مسیرهای فرزند
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
راه حل: قوانینی را در مسیرهای والد بنویسید که گسترده باشند و در مسیرهای فرزند، امتیازات خاص‌تری اعطا کنید. اگر نیازهای دسترسی به داده‌های شما نیاز به جزئیات بیشتری دارد، قوانین خود را جزئی نگه دارید. برای کسب اطلاعات بیشتر در مورد Realtime Database Security Rules بلادرنگ آبشاری، به بخش اصلی Syntax در Realtime Database Security Rules مراجعه کنید.

دسترسی بسته

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

Cloud Firestore

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

Realtime Database

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

Cloud Storage

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

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

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

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

Cloud Firestore Security Rules خود را آزمایش کنید

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

برای اعتبارسنجی سریع Firebase Security Rules در کنسول Firebase ، از شبیه‌ساز قوانین Firebase استفاده کنید.