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

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

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

برای کمک هوش مصنوعی، پیام‌واره زیر را در عامل کدنویسی هوش مصنوعی خود (مانند Gemini در Android Studio،‏ Antigravity،‏ Claude Code،‏ Codex، و Cursor) کپی کنید. می‌توانید پیام‌واره را سفارشی‌سازی کنید و با عاملتان تکرار کنید. برای اطلاعات دقیق نصب، به مهارت‌های عامل Firebase مراجعه کنید.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's data.

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

Cloud Firestore

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

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

Realtime Database

اگر می‌خواهید مطمئن شوید داده‌هایی که حاوی مقادیر خاصی هستند به پایگاه داده‌تان اضافه نمی‌شوند، آن مقدار را در قوانینتان اضافه می‌کنید و آن را برای نوشتن غیرمجاز می‌کنید. برای مثال، اگر می‌خواهید هرگونه نوشتن حاوی مقادیر 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')
    }
  }

Cloud Storage

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

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

استفاده از داده‌های موجود در Firebase Security Rules

Cloud Firestore

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

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

Realtime Database

در Realtime Database، از قوانین .validate برای اعمال ساختارهای داده و اعتبارسنجی قالب و محتوای داده‌ها استفاده کنید. Security Rules قوانین .validate را پس‌از تأیید اینکه قانون .write دسترسی را اعطا می‌کند اجرا کنید.

قوانین .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);
Objective-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];
Swift
توجه: این محصول 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);
REST (انتقال بازنمودی وضعیت)
# 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

Cloud Storage

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

شیء resource حاوی جفت‌های کلید-مقدار با فراداده فایل است که در شیء Cloud Storage ظاهر شده است. این ویژگی‌ها را می‌توان در درخواست‌های read یا write بررسی کرد تا از تمامیت داده‌ها اطمینان حاصل شود. شیء resource فراداده‌های فایل‌های موجود در دسته Cloud Storage شما را بررسی می‌کند.

  service firebase.storage {
    match /b/{bucket}/o {
      match /images {
        match /{fileName} {
          // 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 {
        // 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) Filename (stored in imageId wildcard variable) is less than 32 characters
        match /{imageId} {
          allow read;
          allow write: if request.resource.size < 5 * 1024 * 1024
                       && request.resource.contentType.matches('image/.*')
                       && request.resource.contentType == resource.contentType
                       && imageId.size() < 32
        }
      }
    }
  }

فهرست کامل ویژگی‌ها در شیء resource در سند مرجع دردسترس است.