सुरक्षा के नियम कैसे काम करते हैं

ऐप्लिकेशन डेवलप करने से जुड़ी पहेली में सुरक्षा जानना, सबसे मुश्किल कामों में से एक हो सकता है. ज़्यादातर ऐप्लिकेशन में, डेवलपर को ऐसा सर्वर बनाना और चलाना चाहिए प्रमाणीकरण (उपयोगकर्ता कौन है) और प्राधिकरण (उपयोगकर्ता क्या कर सकता है) को संभालता है.

Firebase Security Rules मिडल (सर्वर) लेयर हटाएं और सीधे आपके डेटा से कनेक्ट करने वाले क्लाइंट के लिए, पाथ के आधार पर अनुमतियां तय करने की अनुमति दें. आने वाले अनुरोधों पर नियम कैसे लागू होते हैं, इस बारे में ज़्यादा जानने के लिए इस गाइड का इस्तेमाल करें.

किसी प्रॉडक्ट के नियमों के बारे में ज़्यादा जानने के लिए, उसे चुनें.

Cloud Firestore

बुनियादी स्ट्रक्चर

Cloud Firestore और Cloud Storage में Firebase Security Rules इस स्ट्रक्चर का इस्तेमाल करते हैं और सिंटैक्स:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

नियम बनाते समय, इन ज़रूरी कॉन्सेप्ट को समझना ज़रूरी है:

  • अनुरोध: allow स्टेटमेंट में इस्तेमाल किया गया तरीका. ये हैं को चलाने की अनुमति है. स्टैंडर्ड तरीके हैं: get, list, create, update, और delete. read और write सुविधा के तरीके दिए गए डेटाबेस या स्टोरेज पाथ के लिए, पढ़ने और लिखने का ऐक्सेस चालू करें.
  • पाथ: डेटाबेस या स्टोरेज की जगह, जिसे यूआरआई पाथ.
  • नियम: allow स्टेटमेंट, जिसमें एक शर्त शामिल होती है. अगर यह शर्त सही होती है, तो अनुरोध को अनुमति दी जाती है.

सुरक्षा के नियम वर्शन 2

मई 2019 से, Firebase के सुरक्षा नियमों का वर्शन 2 अब उपलब्ध है उपलब्ध हैं. नियमों के दूसरे वर्शन में, बार-बार इस्तेमाल होने वाले वाइल्डकार्ड {name=**} के काम करने का तरीका बदला गया है. अगर आपको कलेक्शन ग्रुप क्वेरी का इस्तेमाल करें. आपको इसके लिए ऑप्ट-इन करना होगा rules_version = '2'; को अपनी सुरक्षा में पहली लाइन बनाकर, वर्शन 2 नियम:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

मिलते-जुलते पाथ

सभी मैच स्टेटमेंट, दस्तावेज़ों पर ले जाने चाहिए, न कि कलेक्शन पर. मैच स्टेटमेंट किसी खास दस्तावेज़ के बारे में बता सकता है, जैसे कि match /cities/SF या वाइल्डकार्ड का इस्तेमाल करता है तय पाथ में किसी दस्तावेज़ पर ले जाने के लिए, जैसा कि match /cities/{city} में बताया गया है.

ऊपर दिए गए उदाहरण में, मैच स्टेटमेंट में {city} वाइल्डकार्ड सिंटैक्स का इस्तेमाल किया गया है. इसका मतलब है कि यह नियम, cities कलेक्शन में मौजूद किसी भी दस्तावेज़ पर लागू होता है. जैसे, /cities/SF या /cities/NYC. जब मिलान कथन में allow एक्सप्रेशन होते हैं city वैरिएबल का आकलन किया गया और शहर के दस्तावेज़ के नाम के तौर पर सेट किया गया, जैसे कि SF या NYC.

मिलते-जुलते उप-संग्रह

Cloud Firestore में मौजूद डेटा को दस्तावेज़ों के कलेक्शन में बांटा गया है. साथ ही, सभी दस्तावेज़ में सब-कलेक्शन के हिसाब से क्रम में बदलाव हो सकता है. यह ज़रूरी है कि समझें कि सुरक्षा के नियम, हैरारकी वाले डेटा के साथ कैसे इंटरैक्ट करते हैं.

मान लें कि cities कलेक्शन के हर दस्तावेज़ में एक landmarks सब-कलेक्शन है. सुरक्षा से जुड़े नियम सिर्फ़ मैच होने वाले पाथ पर लागू होते हैं. इसलिए, cities कलेक्शन पर तय किए गए ऐक्सेस कंट्रोल, landmarks सब-कलेक्शन पर लागू नहीं होते. इसके बजाय, सब-कलेक्शन के ऐक्सेस को कंट्रोल करने के लिए साफ़ तौर पर नियम लिखें:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

      // Explicitly define rules for the 'landmarks' subcollection
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}

match स्टेटमेंट को नेस्ट करने पर, match स्टेटमेंट का पाथ हमेशा होता है आउटर match स्टेटमेंट के पाथ से मिलता-जुलता. नीचे दिए गए नियमसेट इसलिए समान हैं:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

बार-बार होने वाले वाइल्डकार्ड

अगर आपको नियमों को मनचाहे तरीके से डीप हैरारकी पर लागू करने की सुविधा चाहिए, तो रिकर्सिव वाइल्डकार्ड सिंटैक्स, {name=**}:

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

बार-बार इस्तेमाल होने वाले वाइल्डकार्ड सिंटैक्स का इस्तेमाल करने पर, वाइल्डकार्ड वैरिएबल में मैच होने वाला पूरा पाथ सेगमेंट शामिल होगा. भले ही, दस्तावेज़ किसी नेस्ट किए गए सबकलेक्शन में हो. उदाहरण के लिए, ऊपर दिए गए नियम /cities/SF/landmarks/coit_tower पर स्थित दस्तावेज़ है, और document वैरिएबल SF/landmarks/coit_tower होगा.

हालांकि, ध्यान रखें कि बार-बार होने वाले वाइल्डकार्ड का व्यवहार, नियमों के हिसाब से तय होता है वर्शन है.

संस्करण 1

सुरक्षा के नियम डिफ़ॉल्ट रूप से वर्शन 1 का इस्तेमाल करते हैं. वर्शन 1 में, बार-बार होने वाले वाइल्डकार्ड एक या उससे ज़्यादा पाथ आइटम को मैच करेगा. वे खाली पाथ से मेल नहीं खाते, इसलिए match /cities/{city}/{document=**}, सब-कलेक्शन में मौजूद दस्तावेज़ों से मेल खाता है, लेकिन cities संग्रह में नहीं, जबकि match /cities/{document=**} मिलान cities कलेक्शन और सब-कलेक्शन में से दोनों दस्तावेज़.

बार-बार इस्तेमाल होने वाले वाइल्डकार्ड, मैच स्टेटमेंट के आखिर में होने चाहिए.

वर्शन 2

सुरक्षा के नियमों के वर्शन 2 में, बार-बार होने वाले वाइल्डकार्ड, शून्य या उससे ज़्यादा पाथ से मेल खाते हैं आइटम. match/cities/{city}/{document=**} किसी भी दस्तावेज़ से मेल खाता है cities कलेक्शन में मौजूद दस्तावेज़ और सब-कलेक्शन.

इसके लिए, आपको सबसे ऊपर rules_version = '2'; को जोड़कर, वर्शन 2 में ऑप्ट-इन करना होगा आपके सुरक्षा नियम:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

आपके पास हर मैच स्टेटमेंट के लिए, बार-बार इस्तेमाल होने वाला ज़्यादा से ज़्यादा एक वाइल्डकार्ड हो सकता है, लेकिन 2, इस वाइल्डकार्ड को मैच स्टेटमेंट में कहीं भी रखा जा सकता है. उदाहरण के लिए:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the songs collection group
    match /{path=**}/songs/{song} {
      allow read, write: if <condition>;
    }
  }
}

अगर कलेक्शन ग्रुप क्वेरी का इस्तेमाल किया जा रहा है, तो आपको वर्शन 2 में, कलेक्शन ग्रुप क्वेरी सुरक्षित करना देखें.

ओवरलैप होने वाले मैच स्टेटमेंट

किसी दस्तावेज़ का मिलान एक से ज़्यादा match स्टेटमेंट से हो सकता है. इस वह मामला जहां कई allow एक्सप्रेशन किसी अनुरोध से मेल खाते हैं, तो ऐक्सेस की अनुमति है अगर कोई शर्त true है:

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

ऊपर दिए गए उदाहरण में, cities संग्रह में मौजूद सभी लेख और लेख अनुमति है, क्योंकि दूसरा नियम हमेशा true होता है, भले ही पहला नियम नियम हमेशा false होता है.

सुरक्षा नियम की सीमाएं

सुरक्षा के नियमों को लागू करते समय, इन सीमाओं का ध्यान रखें:

सीमा विवरण
हर अनुरोध के लिए ज़्यादा से ज़्यादा exists(), get(), और getAfter() कॉल की संख्या
  • एक दस्तावेज़ के अनुरोध और क्वेरी के अनुरोध के लिए 10.
  • एक से ज़्यादा दस्तावेज़ पढ़ने, लेन-देन, और बैच में लिखें. हर ऑपरेशन पर, 10 की पिछली सीमा भी लागू होती है.

    उदाहरण के लिए, मान लें कि आपने कई दस्तावेज़ों में लिखने का अनुरोध किया है तीन कार्रवाइयां लिखने और आपके सुरक्षा नियमों में दो दस्तावेज़ इस्तेमाल करने की जानकारी हर राइटिंग की पुष्टि करने के लिए, कॉल ऐक्सेस करता है. इस मामले में, हर बार डेटा लिखने के लिए, 10 में से दो ऐक्सेस कॉल का इस्तेमाल किया जाता है. साथ ही, एक साथ कई बार डेटा लिखने के अनुरोध के लिए, 20 में से छह ऐक्सेस कॉल का इस्तेमाल किया जाता है.

सीमा से ज़्यादा नतीजे पाने पर, अनुमति नहीं मिलने की गड़बड़ी दिखेगी.

कुछ दस्तावेज़ ऐक्सेस कॉल कैश मेमोरी में सेव किए जा सकते हैं, और कैश मेमोरी में सेव किए गए कॉल, इन सीमाओं के दायरे में नहीं आते हैं.

नेस्ट किए गए match स्टेटमेंट की ज़्यादा से ज़्यादा गहराई 10
पथ सेगमेंट में, नेस्ट किए गए सेट में अधिकतम संख्यात्मक विश्लेषण की अनुमति है match के स्टेटमेंट 100
नेस्ट किए गए match स्टेटमेंट के सेट में, पाथ कैप्चर वैरिएबल की ज़्यादा से ज़्यादा संख्या 20
अधिकतम फ़ंक्शन कॉल डेप्थ 20
फ़ंक्शन के आर्ग्युमेंट की ज़्यादा से ज़्यादा संख्या 7
हर फ़ंक्शन के लिए let वैरिएबल बाइंडिंग की ज़्यादा से ज़्यादा संख्या 10
बार-बार होने वाले या साइक्लिकल फ़ंक्शन कॉल की ज़्यादा से ज़्यादा संख्या 0 &lpar;अनुमति नहीं है&rpar;
हर अनुरोध के लिए आकलन किए गए एक्सप्रेशन की ज़्यादा से ज़्यादा संख्या 1,000
नियमसेट का ज़्यादा से ज़्यादा साइज़ नियमों के सेट का साइज़, इन दो सीमाओं के अंदर होना चाहिए:
  • नियमसेट के टेक्स्ट सोर्स के साइज़ की सीमा 256 केबी है का इस्तेमाल करके, Firebase कंसोल या सीएलआई से पब्लिश किया गया हो firebase deploy.
  • कंपाइल किए गए रूलसेट के साइज़ की 250 केबी की सीमा तय की गई है. जब Firebase सोर्स को प्रोसेस करता है और उसे बैक-एंड.

Cloud Storage

बुनियादी स्ट्रक्चर

Cloud Firestore और Cloud Storage में Firebase Security Rules इस स्ट्रक्चर का इस्तेमाल करते हैं और सिंटैक्स:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

नियम बनाते समय, इन ज़रूरी कॉन्सेप्ट को समझना ज़रूरी है:

  • अनुरोध: allow स्टेटमेंट में इस्तेमाल किया गया तरीका. ये हैं को चलाने की अनुमति है. स्टैंडर्ड तरीके हैं: get, list, create, update, और delete. read और write सुविधा के तरीके दिए गए डेटाबेस या स्टोरेज पाथ के लिए, पढ़ने और लिखने का ऐक्सेस चालू करें.
  • पाथ: डेटाबेस या स्टोरेज की जगह, जिसे यूआरआई पाथ.
  • नियम: allow स्टेटमेंट, जिसमें ऐसी शर्त शामिल होती है जो अनुरोध करें.

मिलते-जुलते पाथ

Cloud Storage Security Rules match Cloud Storage में फ़ाइलों को ऐक्सेस करने के लिए इस्तेमाल किए जाने वाले फ़ाइल पाथ. नियम में सटीक पाथ या वाइल्डकार्ड पाथ 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 के नतीजे के हिसाब से पढ़ा जा सकता है.

वाइल्डकार्ड वैरिएबल का रेफ़रंस, match की सबमिट फ़ाइल में जाकर लिया जा सकता है नाम या पाथ की अनुमति:

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

Cloud Storage Security Rules कैस्केड नहीं करते. साथ ही, नियमों का आकलन सिर्फ़ तब किया जाता है, जब अनुरोध पाथ, बताए गए नियमों वाले पाथ से मेल खाता हो.

आकलन का अनुरोध करना

अपलोड, डाउनलोड, मेटाडेटा में बदलाव, और मिटाए गए डेटा का आकलन, Cloud Storage पर भेजे गए request का इस्तेमाल करके किया जाता है. request वैरिएबल में वह फ़ाइल पाथ जहां अनुरोध किया जा रहा है, वह समय जब अनुरोध किया जाता है मिला है और अगर अनुरोध कोई अनुरोध है, तो resource की नई वैल्यू. एचटीटीपी हेडर और पुष्टि की स्थिति भी शामिल है.

request ऑब्जेक्ट में उपयोगकर्ता का यूनीक आईडी और request.auth ऑब्जेक्ट में Firebase Authentication पेलोड भी होता है. इस बारे में ज़्यादा जानकारी, दस्तावेज़ों के पुष्टि सेक्शन में दी गई है.

request ऑब्जेक्ट में प्रॉपर्टी की पूरी सूची नीचे दी गई है:

प्रॉपर्टी टाइप ब्यौरा
auth map<string, string> जब कोई उपयोगकर्ता लॉग इन होता है, तो उपयोगकर्ता का uid, यूनीक आईडी, और token, Firebase Authentication JWT दावों का मैप. ऐसा न करने पर, यह null होगा.
params मैप<स्ट्रिंग, स्ट्रिंग> अनुरोध के क्वेरी पैरामीटर वाला मैप.
path पाथ path, उस पाथ को दिखाता है जहां अनुरोध किया जा रहा है.
resource map<string, string> नई संसाधन वैल्यू, सिर्फ़ write अनुरोध पर मौजूद है.
time timestamp अनुरोध का आकलन करने के लिए सर्वर के समय को दिखाने वाला टाइमस्टैंप.

संसाधन का आकलन

नियमों का मूल्यांकन करते समय, हो सकता है कि आप फ़ाइल के मेटाडेटा का मूल्यांकन भी करना चाहें अपलोड, डाउनलोड, संशोधित या हटाया जा रहा है. इसकी मदद से, जटिल और शक्तिशाली नियम जो ऐसे काम करते हैं जैसे कुछ फ़ाइलों को अपलोड किया जाने वाला कॉन्टेंट टाइप या सिर्फ़ एक तय साइज़ से बड़ी फ़ाइलें हटाया गया.

Cloud Storage के लिए Firebase Security Rules, resource में फ़ाइल मेटाडेटा उपलब्ध कराता है ऑब्जेक्ट है, जिसमें Cloud Storage ऑब्जेक्ट. इन प्रॉपर्टी की जांच read पर की जा सकती है या डेटा के रखरखाव को पक्का करने के लिए write अनुरोध.

write अनुरोधों (जैसे, अपलोड, मेटाडेटा अपडेट, और मिटाना) पर, resource ऑब्जेक्ट के अलावा, आपके पास request.resource ऑब्जेक्ट का इस्तेमाल करने का विकल्प भी होता है. resource ऑब्जेक्ट में, फ़ाइल के उस मेटाडेटा की जानकारी होती है जो फ़िलहाल अनुरोध पाथ पर मौजूद है. वहीं, request.resource ऑब्जेक्ट में, फ़ाइल के उस मेटाडेटा का सबसेट होता है जिसे लिखने की अनुमति होने पर लिखा जाता है. यह पक्का करने के लिए कि डेटा इंटिग्रिटी की अनुमति दें या ऐप्लिकेशन की पाबंदियां लागू करें. जैसे, फ़ाइल टाइप या साइज़.

resource ऑब्जेक्ट में प्रॉपर्टी की पूरी सूची नीचे दी गई है:

प्रॉपर्टी टाइप ब्यौरा
name स्ट्रिंग ऑब्जेक्ट का पूरा नाम
bucket स्ट्रिंग उस बकेट का नाम जिसमें यह ऑब्जेक्ट मौजूद है.
generation int इस ऑब्जेक्ट का Google Cloud Storage ऑब्जेक्ट जनरेशन.
metageneration int इस ऑब्जेक्ट का Google Cloud Storage ऑब्जेक्ट मेटाजनरेशन.
size int ऑब्जेक्ट का साइज़, बाइट में.
timeCreated timestamp टाइमस्टैंप, जिससे पता चलता है कि ऑब्जेक्ट कब बनाया गया था.
updated timestamp ऑब्जेक्ट को आखिरी बार अपडेट किए जाने का समय दिखाने वाला टाइमस्टैंप.
md5Hash स्ट्रिंग ऑब्जेक्ट का MD5 हैश.
crc32c स्ट्रिंग ऑब्जेक्ट का crc32c हैश.
etag स्ट्रिंग इस ऑब्जेक्ट से जुड़ा ईटैग.
contentDisposition स्ट्रिंग इस ऑब्जेक्ट से जुड़ा कॉन्टेंट मैनेजमेंट.
contentEncoding स्ट्रिंग इस ऑब्जेक्ट के साथ जुड़ी कॉन्टेंट एन्कोडिंग.
contentLanguage स्ट्रिंग इस ऑब्जेक्ट के कॉन्टेंट की भाषा.
contentType स्ट्रिंग इस ऑब्जेक्ट से जुड़ा कॉन्टेंट टाइप.
metadata मैप<स्ट्रिंग, स्ट्रिंग> डेवलपर की ओर से बताए गए कस्टम मेटाडेटा के कुंजी/वैल्यू पेयर.

request.resource में generation, metageneration, etag, timeCreated, और updated को छोड़कर ये सभी शामिल हैं.

सुरक्षा नियमों की सीमाएं

सुरक्षा के नियमों को लागू करते समय, इन सीमाओं का ध्यान रखें:

सीमा विवरण
हर अनुरोध के लिए, firestore.exists() और firestore.get() कॉल की ज़्यादा से ज़्यादा संख्या

एक दस्तावेज़ वाले अनुरोधों और क्वेरी के अनुरोधों के लिए 2.

इस सीमा से ज़्यादा डेटा अपलोड करने पर, 'अनुमति नहीं दी गई' गड़बड़ी का मैसेज दिखता है.

एक ही दस्तावेज़ के ऐक्सेस कॉल को कैश मेमोरी में सेव किया जा सकता है. साथ ही, कैश मेमोरी में सेव किए गए कॉल की संख्या, सीमाओं में शामिल नहीं की जाती.

पूरा उदाहरण

इन सभी को एक साथ मिलाकर, किसी इमेज के लिए नियमों का पूरा उदाहरण बनाया जा सकता है स्टोरेज की सुविधा:

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

Realtime Database

बुनियादी स्ट्रक्चर

Realtime Database में, Firebase Security Rules में JavaScript जैसे एक्सप्रेशन होते हैं. JSON दस्तावेज़.

इसके लिए, इस सिंटैक्स का इस्तेमाल किया जाता है:

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

इस नियम में तीन बुनियादी एलिमेंट होते हैं:

  • पाथ: डेटाबेस की जगह. यह आपके डेटाबेस के JSON के स्ट्रक्चर की कॉपी बनाता है.
  • अनुरोध: नियम ऐक्सेस देने के लिए इन तरीकों का इस्तेमाल करता है. read और write नियम, पढ़ने और लिखने का ऐक्सेस देते हैं, जबकि validate नियम के आधार पर ऐक्सेस देने के लिए, सेकंडरी पुष्टि के तौर पर काम करें: डेटा शामिल है.
  • शर्त: यह शर्त, अनुरोध को तब अनुमति देती है, जब वह सही हो.

नियम, पाथ पर कैसे लागू होते हैं

Realtime Database में, Rules अपने आप लागू होता है, जिसका मतलब है कि नियम ऊंचे लेवल के पैरंट नोड, ज़्यादा जानकारी वाले चाइल्ड नोड पर नियमों को बदल देते हैं और ज़्यादा गहरे नोड पर मौजूद नियम, पैरंट पाथ को ऐक्सेस नहीं दे सकते. आपने लोगों तक पहुंचाया मुफ़्त में आपके डेटाबेस के स्ट्रक्चर में ज़्यादा डीप पाथ से, ऐक्सेस को बेहतर या निरस्त नहीं कर सकता, अगर आपने इसे किसी पैरंट पाथ के लिए पहले ही अनुमति दे दी है.

इन नियमों को ध्यान में रखें:

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          // ignored, since read was allowed already
          ".read": false
        }
     }
  }
}

इस सुरक्षा स्ट्रक्चर की मदद से, /bar/ को कभी भी पढ़ने की सुविधा मिलती है /foo/ में true वैल्यू वाला एक चाइल्ड baz शामिल है. /foo/bar/ के तहत ".read": false नियम में ऐसा नहीं है यहां इफ़ेक्ट लागू होता है, क्योंकि चाइल्ड पाथ से ऐक्सेस को रद्द नहीं किया जा सकता.

भले ही यह आपको तुरंत सहज न लगे, लेकिन यह नियमों की भाषा और बहुत जटिल ऐक्सेस के खास अधिकारों को लागू करने की अनुमति देता है वह भी कम से कम मेहनत में. यह खास तौर पर उपयोगकर्ता पर आधारित सुरक्षा के लिए मददगार है.

हालांकि, .validate नियम कैस्केड नहीं होते हैं. सभी पुष्टि करने वाले नियम किसी लिखने की अनुमति के लिए, ज़रूरी है कि वह हैरारकी के सभी लेवल पर पूरा हो.

इसके अलावा, क्योंकि नियम पैरंट पाथ पर वापस लागू नहीं होते, इसलिए पढ़ें या लिखें अगर अनुरोध की गई जगह या किसी पैरंट जगह पर कोई नियम नहीं है, तो कार्रवाई नहीं की जा सकती ऐक्सेस देती है. भले ही, हर उस चाइल्ड पाथ को ऐक्सेस किया जा सकता हो जिस पर असर पड़ा है, मूल स्थान पर पढ़ना पूरी तरह से विफल हो जाएगा. इस स्ट्रक्चर को ध्यान में रखें:

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

नियमों का मूल्यांकन अपने आप होने वाले तरीके से किए जाने पर, ऐसा लग सकता है कि /records/ पाथ फ़ेच करने पर, rec1 दिखेगा लेकिन rec2 नहीं. हालांकि, असल नतीजा एक गड़बड़ी है:

JavaScript
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
Objective-C
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  // success block is not called
} withCancelBlock:^(NSError * _Nonnull error) {
  // cancel block triggered with PERMISSION_DENIED
}];
Swift
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
var ref = FIRDatabase.database().reference()
ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // success block is not called
}, withCancelBlock: { error in
    // cancel block triggered with PERMISSION_DENIED
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // success method is not called
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback triggered with PERMISSION_DENIED
  });
});
REST
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

/records/ में, डेटा पढ़ने की कार्रवाई एक बार में पूरी होती है. साथ ही, /records/ में मौजूद सभी डेटा को ऐक्सेस करने की अनुमति देने वाला कोई नियम नहीं है. इसलिए, इससे PERMISSION_DENIED गड़बड़ी का मैसेज दिखेगा. अगर हम अपने Firebase कंसोल में सुरक्षा सिम्युलेटर में इस नियम का आकलन करते हैं, तो हमें पता चलता है कि पढ़ने की अनुमति नहीं दी गई थी:

Attempt to read /records with auth=Success(null)
    /
    /records

No .read rule allowed the operation.
Read was denied.

कार्रवाई अस्वीकार कर दी गई, क्योंकि पढ़ने के लिए बने किसी भी नियम ने /records/ पाथ को ऐक्सेस करने की अनुमति नहीं दी. हालांकि, ध्यान दें कि rec1 के लिए बने नियम का कभी आकलन नहीं किया गया, क्योंकि वह उस पाथ में नहीं था जिसके लिए हमने अनुरोध किया था. rec1 को फ़ेच करने के लिए, हमें इसे सीधे ऐक्सेस करना होगा:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Objective-C
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Swift
ध्यान दें: Firebase का यह प्रॉडक्ट, App Clip के टारगेट पर उपलब्ध नहीं है.
var ref = FIRDatabase.database().reference()
ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // SUCCESS!
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records/rec1");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // SUCCESS!
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback is not called
  }
});
REST
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

लोकेशन वैरिएबल

Realtime Database Rules $location का इस्तेमाल करते हैं वैरिएबल का इस्तेमाल करके पाथ सेगमेंट से मिलान कर सकते हैं. अपने पाथ के आगे $ प्रीफ़िक्स का इस्तेमाल करें सेगमेंट का उपयोग करें, ताकि पाथ पर मौजूद किसी भी चाइल्ड नोड से आपके नियम का मिलान किया जा सके.

  {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }

$variable का इस्तेमाल कॉन्स्टेंट पाथ के साथ भी किया जा सकता है नाम.

  {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }