اعتبار سنجی داده ها

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

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

محدودیت در داده های جدید

Cloud Firestore

اگر می‌خواهید مطمئن شوید که سندی که حاوی فیلد خاصی است ایجاد نشده است، می‌توانید فیلد را در شرط allow قرار دهید. برای مثال، اگر می‌خواهید ایجاد هر سندی را که حاوی فیلد ranking است رد کنید، آن را در شرایط create غیرمجاز خواهید کرد.

  service cloud.firestore {
    match /databases/{database}/documents {
      // Disallow
      match /cities/{city} {
        allow create: if !("ranking" in request.resource.data)
      }
    }
  }

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

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

  {
    "rules": {
      // Write is allowed for all paths
      ".write": true,
      // Allows writes only if new data doesn't include a `ranking` child value
      ".validate": "!newData.hasChild('ranking')
    }
  }

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

اگر می‌خواهید مطمئن شوید که فایلی که حاوی فراداده خاصی است ایجاد نمی‌شود، می‌توانید متادیتا را در شرایط allow قرار دهید. به عنوان مثال، اگر می‌خواهید ایجاد هر فایلی را که حاوی ابرداده ranking رد کنید، آن را در شرایط create غیرفعال می‌کنید.

  service firebase.storage {
    match /b/{bucket}/o {
      match /files/{allFiles=**} {
      // Disallow
        allow create: if !("ranking" in request.resource.metadata)
      }
    }
  }

از داده های موجود در قوانین امنیتی Firebase استفاده کنید

Cloud Firestore

بسیاری از برنامه ها اطلاعات کنترل دسترسی را به صورت فیلدهایی روی اسناد در پایگاه داده ذخیره می کنند. قوانین امنیتی Cloud Firestore می توانند به صورت پویا دسترسی را بر اساس داده های سند مجاز یا رد کنند:

  service cloud.firestore {
    match /databases/{database}/documents {
      // Allow the user to read data if the document has the 'visibility'
      // field set to 'public'
      match /cities/{city} {
        allow read: if resource.data.visibility == 'public';
      }
    }
  }

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

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

   service cloud.firestore {
     match /databases/{database}/documents {
      // Make sure all cities have a positive population and
      // the name is not changed
      match /cities/{city} {
        allow update: if request.resource.data.population > 0
                      && request.resource.data.name == resource.data.name;
      }
    }
  }

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

در پایگاه داده بیدرنگ، از قوانین .validate برای اجرای ساختارهای داده و اعتبارسنجی قالب و محتوای داده ها استفاده کنید. قوانین پس از تأیید اینکه یک قانون .write اجازه دسترسی می دهد، قوانین اعتبار .validate را اجرا می کنند.

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

قوانین .validate زیر را در نظر بگیرید:

  {
    "rules": {
      // write is allowed for all paths
      ".write": true,
      "widget": {
        // a valid widget must have attributes "color" and "size"
        // allows deleting widgets (since .validate is not applied to delete rules)
        ".validate": "newData.hasChildren(['color', 'size'])",
        "size": {
          // the value of "size" must be a number between 0 and 99
          ".validate": "newData.isNumber() &&
                        newData.val() >= 0 &&
                        newData.val() <= 99"
        },
        "color": {
          // the value of "color" must exist as a key in our mythical
          // /valid_colors/ index
          ".validate": "root.child('valid_colors/' + newData.val()).exists()"
        }
      }
    }
  }

نوشتن درخواست ها در پایگاه داده با قوانین بالا نتایج زیر را به همراه خواهد داشت:

جاوا اسکریپت
var ref = db.ref("/widget");

// PERMISSION_DENIED: does not have children color and size
ref.set('foo');

// PERMISSION DENIED: does not have child color
ref.set({size: 22});

// PERMISSION_DENIED: size is not a number
ref.set({ size: 'foo', color: 'red' });

// SUCCESS (assuming 'blue' appears in our colors list)
ref.set({ size: 21, color: 'blue'});

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child('size').set(99);
هدف-C
توجه: این محصول Firebase در هدف App Clip موجود نیست.
FIRDatabaseReference *ref = [[[FIRDatabase database] reference] child: @"widget"];

// PERMISSION_DENIED: does not have children color and size
[ref setValue: @"foo"];

// PERMISSION DENIED: does not have child color
[ref setValue: @{ @"size": @"foo" }];

// PERMISSION_DENIED: size is not a number
[ref setValue: @{ @"size": @"foo", @"color": @"red" }];

// SUCCESS (assuming 'blue' appears in our colors list)
[ref setValue: @{ @"size": @21, @"color": @"blue" }];

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
[[ref child:@"size"] setValue: @99];
سریع
توجه: این محصول Firebase در هدف App Clip موجود نیست.
var ref = FIRDatabase.database().reference().child("widget")

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo")

// PERMISSION DENIED: does not have child color
ref.setValue(["size": "foo"])

// PERMISSION_DENIED: size is not a number
ref.setValue(["size": "foo", "color": "red"])

// SUCCESS (assuming 'blue' appears in our colors list)
ref.setValue(["size": 21, "color": "blue"])

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
جاوا
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("widget");

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo");

// PERMISSION DENIED: does not have child color
ref.child("size").setValue(22);

// PERMISSION_DENIED: size is not a number
Map<String,Object> map = new HashMap<String, Object>();
map.put("size","foo");
map.put("color","red");
ref.setValue(map);

// SUCCESS (assuming 'blue' appears in our colors list)
map = new HashMap<String, Object>();
map.put("size", 21);
map.put("color","blue");
ref.setValue(map);

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
باقی مانده
# PERMISSION_DENIED: does not have children color and size
curl -X PUT -d 'foo' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION DENIED: does not have child color
curl -X PUT -d '{"size": 22}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION_DENIED: size is not a number
curl -X PUT -d '{"size": "foo", "color": "red"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# SUCCESS (assuming 'blue' appears in our colors list)
curl -X PUT -d '{"size": 21, "color": "blue"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# If the record already exists and has a color, this will
# succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
# will fail to validate
curl -X PUT -d '99' \
https://docs-examples.firebaseio.com/rest/securing-data/example/size.json

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

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

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

  service firebase.storage {
    match /b/{bucket}/o {
      match /images {
        match /{allImages=**} {
          // Allow reads if a custom 'visibility' field is set to 'public'
          allow read: if resource.metadata.visibility == 'public';
        }
      }
    }
  }

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

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

  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
        // 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/.*')
                       && request.resource.contentType == resource.contentType
                       && imageId.size() < 32
        }
      }
    }
  }

فهرست کاملی از خواص موجود در شی resource در مستندات مرجع موجود است.