آموزش ایمن سازی فایل ها

Cloud Storage for Firebase یک مدل امنیتی مبتنی بر مسیر به نام Firebase Security Rules برای Cloud Storage ارائه می‌کند که به شما امکان می‌دهد به سرعت و به راحتی فایل‌های خود را ایمن کنید.

قوانین را درک کنید

Firebase Security Rules برای Cloud Storage برای تعیین اینکه چه کسی به فایل‌های ذخیره‌شده در Cloud Storage دسترسی خواندن و نوشتن دارد، و همچنین نحوه ساختار فایل‌ها و حاوی چه متادیتاهایی استفاده می‌شود. نوع اصلی قانون، قانون allow است که به درخواست‌های read و write اجازه می‌دهد اگر یک شرط اختیاری مشخص شده باشد، برای مثال:

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

مسیرهای تطبیق

Cloud Storage Security Rules با مسیرهای فایل مورد استفاده برای دسترسی به فایل‌ها در Cloud Storage match . قوانین می توانند دقیقاً با مسیرها یا مسیرهای عام match و قوانین نیز می توانند تودرتو باشند. اگر هیچ قانون تطبیقی ​​اجازه یک روش درخواست را نمی دهد، یا شرط به false ارزیابی می شود، درخواست رد می شود.

مطابقت دقیق

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

مسابقات تو در تو

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

منطبق با حروف عامیانه

قوانین همچنین می توانند برای match یک الگو با استفاده از حروف عام استفاده شوند. عام یک متغیر با نام است که یا یک رشته منفرد مانند profilePhoto.png یا بخش های مسیر متعدد مانند images/profilePhoto.png را نشان می دهد.

یک علامت عام با افزودن پرانتزهای فرفری در اطراف نام عام، مانند {string} ایجاد می‌شود. با افزودن =** به نام عام می‌توان یک علامت عام بخش چندگانه، مانند {path=**} را اعلام کرد:

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

اگر چندین قانون با یک فایل مطابقت داشته باشد، نتیجه OR نتیجه ارزیابی همه قوانین است. به این معنا که، اگر هر قانونی که فایل مطابقت داشته باشد، به true ارزیابی شود، نتیجه true است.

در قوانین بالا، فایل "images/profilePhoto.png" در صورتی قابل خواندن است که condition یا other_condition به درستی ارزیابی شود، در حالی که فایل "images/users/user:12345/profilePhoto.png" فقط مشمول نتیجه other_condition است. .

یک متغیر wildcard را می توان از داخل match نام فایل یا مجوز مسیر ارجاع داد:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Cloud Storage Security Rules آبشاری نمی شوند و قوانین تنها زمانی ارزیابی می شوند که مسیر درخواست با مسیری با قوانین مشخص شده مطابقت داشته باشد.

درخواست ارزیابی

بارگذاری‌ها، بارگیری‌ها، تغییرات فراداده، و حذف‌ها با استفاده از request ارسال شده به Cloud Storage ارزیابی می‌شوند. متغیر request شامل مسیر فایلی است که درخواست در آن انجام می شود، زمان دریافت درخواست و مقدار resource جدید اگر درخواست یک نوشتن باشد. هدرهای HTTP و وضعیت احراز هویت نیز گنجانده شده است.

شی request همچنین شامل شناسه منحصر به فرد کاربر و بارگذاری Firebase Authentication در شی request.auth است که در بخش امنیت مبتنی بر کاربر اسناد بیشتر توضیح داده خواهد شد.

لیست کاملی از خواص در شی request در زیر موجود است:

اموال تایپ کنید توضیحات
auth نقشه<رشته، رشته> زمانی که کاربر وارد سیستم می‌شود، uid ، شناسه منحصربه‌فرد کاربر، و token ، نقشه‌ای از Firebase Authentication JWT را ارائه می‌کند. در غیر این صورت null خواهد شد.
params نقشه<رشته، رشته> نقشه حاوی پارامترهای پرس و جو درخواست.
path مسیر path نشان دهنده مسیری است که درخواست در آن انجام می شود.
resource نقشه<رشته، رشته> مقدار منبع جدید، فقط در درخواست‌های write وجود دارد.
time مهر زمانی یک مهر زمانی که نشان دهنده زمان ارزیابی درخواست سرور است.

ارزیابی منابع

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

Firebase Security Rules برای Cloud Storage ، ابرداده‌های فایل را در شی resource ارائه می‌کند، که شامل جفت‌های کلید/مقدار از ابرداده‌های ظاهر شده در یک شی Cloud Storage است. این ویژگی ها را می توان در درخواست های read یا write برای اطمینان از یکپارچگی داده ها بررسی کرد.

در درخواست‌های write (مانند آپلود، به‌روزرسانی فراداده و حذف)، علاوه بر شی resource ، که حاوی فراداده فایل برای فایلی است که در حال حاضر در مسیر درخواست وجود دارد، شما همچنین می‌توانید از شی request.resource استفاده کنید. که حاوی زیرمجموعه ای از فراداده فایل است که در صورت مجاز بودن نوشتن نوشته می شود. می توانید از این دو مقدار برای اطمینان از یکپارچگی داده ها یا اعمال محدودیت های برنامه مانند نوع یا اندازه فایل استفاده کنید.

لیست کاملی از خواص در شی resource در زیر موجود است:

اموال تایپ کنید توضیحات
name رشته نام کامل شی
bucket رشته نام سطلی که این شی در آن قرار دارد.
generation بین المللی تولید شی GCS این شی.
metageneration بین المللی متا تولید شی GCS این شی.
size بین المللی اندازه شی در بایت.
timeCreated مهر زمانی مهر زمانی که نشان دهنده زمان ایجاد یک شی است.
updated مهر زمانی مهر زمانی که نشان‌دهنده زمان آخرین به‌روزرسانی یک شی است.
md5Hash رشته هش MD5 از شی.
crc32c رشته یک هش crc32c از شی.
etag رشته تگ مرتبط با این شی.
contentDisposition رشته محتوای محتوای مرتبط با این شی.
contentEncoding رشته رمزگذاری محتوای مرتبط با این شی.
contentLanguage رشته زبان محتوای مرتبط با این شی.
contentType رشته نوع محتوای مرتبط با این شی.
metadata نقشه<رشته، رشته> جفت کلید/مقدار متادیتای سفارشی اضافی و مشخص شده توسط توسعه دهنده.

request.resource شامل همه اینها به استثنای generation , metageneration , etag , timeCreated و updated .

مثال کامل

با کنار هم قرار دادن همه آنها، می توانید یک مثال کامل از قوانین برای راه حل ذخیره سازی تصویر ایجاد کنید:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type (if it exists)
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     }
   }
 }
}

اکنون اجازه دهید Firebase Authentication برای دسترسی به فایل به ازای هر کاربر در بخش User Security یکپارچه کنیم.