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

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

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

به قوانین امنیتی Firebase خود دسترسی پیدا کنید

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

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

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

قوانین امنیتی Firebase را بدانید

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

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

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

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

دسترسی آزاد

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

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

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;
    }
  }
}

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

{
  // 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
  }
}
    

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

// 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 via 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 است. درباره احراز هویت کاربران با قوانین بیشتر بیاموزید.

Cloud Firestore

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

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

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

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

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

Cloud Firestore

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

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

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

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

// 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

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

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

(پایگاه داده بیدرنگ) قوانین نادرست به ارث رسیده

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

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

دسترسی بسته

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

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;
    }
  }
}

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

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

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

// 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;
    }
  }
}

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

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

قوانین امنیتی Cloud Firestore خود را آزمایش کنید

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

برای تأیید سریع قوانین امنیتی Firebase در کنسول Firebase، از Firebase Rules Simulator استفاده کنید.