سینتکس اصلی قوانین امنیتی Firebase برای زبان Cloud Storage را بیاموزید

قوانین امنیتی Firebase برای Cloud Storage به شما امکان می دهد دسترسی به اشیاء ذخیره شده در سطل های Cloud Storage را کنترل کنید. سینتکس قوانین انعطاف پذیر به شما امکان می دهد قوانینی را برای کنترل هر عملیاتی، از همه نوشته ها به سطل ذخیره سازی ابری تا عملیات روی یک فایل خاص، ایجاد کنید.

این راهنما نحو اساسی و ساختار قوانین امنیتی فضای ذخیره سازی ابری را برای ایجاد مجموعه قوانین کامل شرح می دهد.

اعلامیه سرویس و پایگاه داده

قوانین امنیتی Firebase برای Cloud Storage همیشه با اعلان زیر شروع می شود:

service firebase.storage {
    // ...
}

اعلامیه service firebase.storage قوانین را در Cloud Storage در بر می گیرد و از تداخل بین قوانین امنیتی Cloud Storage و قوانین سایر محصولات مانند Cloud Firestore جلوگیری می کند.

قوانین اولیه خواندن/نوشتن

قوانین اساسی شامل یک عبارت match است که سطل‌های ذخیره‌سازی ابری را شناسایی می‌کند، یک دستور تطبیق که نام فایل را مشخص می‌کند، و یک عبارت allow جزئیات هنگام خواندن داده‌های مشخص شده مجاز است. عبارت های allow روش های دسترسی (مثلاً خواندن، نوشتن) و شرایطی را که تحت آن دسترسی مجاز یا رد شده است را مشخص می کند.

در مجموعه قواعد پیش‌فرض شما، اولین دستور match از عبارت عام {bucket} استفاده می‌کند تا نشان دهد که قوانین برای همه سطل‌های پروژه شما اعمال می‌شوند. در بخش بعدی درباره ایده تطبیق حروف عام بیشتر بحث خواهیم کرد.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

تمام عبارات تطبیق به فایل ها اشاره می کنند. یک عبارت مطابقت می تواند به یک فایل خاص اشاره کند، مانند match /images/profilePhoto.png .

تطبیق کارت های عام

علاوه بر اشاره به یک فایل، Rules می‌تواند از حروف عام برای اشاره به هر فایلی با پیشوند رشته‌ای در نام آن، از جمله اسلش‌ها، مانند match /images/{imageId} استفاده کند.

در مثال بالا، دستور تطابق از نحو حروف عام {imageId} استفاده می‌کند. این بدان معناست که این قانون برای هر فایلی که /images/ در ابتدای نام آن وجود دارد، مانند /images/profilePhoto.png یا /images/croppedProfilePhoto.png اعمال می شود. هنگامی که عبارات allow در عبارت مطابقت ارزیابی می شوند، متغیر imageId به نام فایل تصویر مانند profilePhoto.png یا croppedProfilePhoto.png تغییر می کند.

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

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

داده های سلسله مراتبی

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

وضعیت مجموعه ای از فایل ها با نام هایی را در نظر بگیرید که همگی با ساقه /images/ شروع می شوند. قوانین امنیتی Firebase فقط در نام فایل منطبق اعمال می شود، بنابراین کنترل های دسترسی تعریف شده در پایه /images/ برای ساقه /mp3s/ اعمال نمی شود. در عوض، قوانین صریح را بنویسید که با الگوهای مختلف نام فایل مطابقت دارند:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

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

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

حروف عام منطبق بازگشتی

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

// Partial match for files that start with "images"
match /images {

  // 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 است. .

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

نسخه 1

قوانین امنیتی Firebase به طور پیش فرض از نسخه 1 استفاده می کند. در نسخه 1، حروف عام بازگشتی با یک یا چند عنصر نام فایل مطابقت دارند، نه با صفر یا چند عنصر. بنابراین، match /images/{filenamePrefixWildcard}/{imageFilename=**} با نام فایلی مانند /images/profilePics/profile.png مطابقت دارد، اما نه /images/badge.png. به جای آن از /images/{imagePrefixorFilename=**} استفاده کنید.

نویسه‌های عام بازگشتی باید در انتهای یک بیانیه مسابقه بیایند.

توصیه می کنیم از نسخه 2 برای ویژگی های قدرتمندتر آن استفاده کنید.

نسخه 2

در نسخه 2 قوانین امنیتی Firebase، حروف عام بازگشتی با صفر یا چند مورد مسیر مطابقت دارند. بنابراین، /images/{filenamePrefixWildcard}/{imageFilename=**} با نام فایل /images/profilePics/profile.png و /images/badge.png مطابقت دارد.

شما باید با افزودن rules_version = '2'; در بالای قوانین امنیتی شما:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

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

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

عملیات دانه بندی

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

عملیات read را می توان به get و list تقسیم کرد.

یک قانون write را می توان به create ، update و delete تقسیم کرد:

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

همپوشانی بیانیه های مسابقه

ممکن است نام فایل با بیش از یک عبارت match مطابقت داشته باشد. در مواردی که چندین عبارت allow با یک درخواست مطابقت دارند، در صورتی که هر یک از شرایط true باشد، دسترسی مجاز است:

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

در مثال بالا، همه خواندن و نوشتن در فایل‌هایی که نام آنها با /images/ شروع می‌شود مجاز است زیرا قانون دوم همیشه true است، حتی زمانی که قانون اول false باشد.

قوانین فیلتر نیستند

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

به عنوان مثال، قانون امنیتی زیر را در نظر بگیرید:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Denied : این قانون درخواست زیر را رد می‌کند زیرا مجموعه نتایج می‌تواند شامل فایل‌هایی باشد که contentType image/png نیست:

وب
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

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

مراحل بعدی

می توانید درک خود را از قوانین امنیتی Firebase برای ذخیره سازی ابری عمیق تر کنید:

می‌توانید موارد استفاده از قوانین امنیتی Firebase را که مخصوص فضای ذخیره‌سازی ابری هستند، کاوش کنید: