Firebase रीयल टाइम डेटाबेस के सुरक्षा नियमों को समझें

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

रीयलटाइम डेटाबेस के सुरक्षा नियमों का सिंटैक्स, JavaScript जैसा होता है. ये चार तरह के होते हैं:

नियम के टाइप
.read इससे पता चलता है कि उपयोगकर्ताओं को डेटा पढ़ने की अनुमति है या नहीं. साथ ही, यह भी पता चलता है कि उपयोगकर्ताओं को डेटा कब पढ़ने की अनुमति है.
.write इससे पता चलता है कि डेटा को लिखने की अनुमति है या नहीं और कब है.
.validate इससे यह तय होता है कि सही फ़ॉर्मैट में दी गई वैल्यू कैसी दिखेगी, उसमें सब-एट्रिब्यूट हैं या नहीं, और डेटा टाइप क्या है.
.indexOn ऑर्डर करने और क्वेरी करने के लिए, इंडेक्स करने के लिए किसी चाइल्ड एलिमेंट की जानकारी देता है.

Realtime Database सुरक्षा की खास जानकारी

Firebase Realtime Database, आपके ऐप्लिकेशन की सुरक्षा को मैनेज करने के लिए, टूल का पूरा सेट उपलब्ध कराता है. इन टूल की मदद से, उपयोगकर्ताओं की पुष्टि करना, उपयोगकर्ता की अनुमतियां लागू करना, और इनपुट की पुष्टि करना आसान हो जाता है.

Firebase के साथ काम करने वाले ऐप्लिकेशन, कई अन्य टेक्नोलॉजी स्टैक वाले ऐप्लिकेशन की तुलना में ज़्यादा क्लाइंट-साइड कोड चलाते हैं. इसलिए, हो सकता है कि हम सुरक्षा के लिए, आपके इस्तेमाल किए जा रहे तरीकों से अलग तरीका अपनाएं.

पुष्टि करना

अपने ऐप्लिकेशन को सुरक्षित रखने का पहला सामान्य कदम, अपने उपयोगकर्ताओं की पहचान करना है. इस प्रोसेस को पुष्टि करना कहा जाता है. उपयोगकर्ताओं को अपने ऐप्लिकेशन में साइन इन करने के लिए, Firebase Authentication का इस्तेमाल किया जा सकता है. Firebase Authentication में, Google और Facebook जैसे सामान्य पुष्टि करने के तरीकों के लिए ड्रॉप-इन सहायता शामिल है. साथ ही, इसमें ईमेल और पासवर्ड लॉगिन, बिना नाम वाले लॉगिन वगैरह भी शामिल हैं.

उपयोगकर्ता की पहचान, सुरक्षा का एक अहम कॉन्सेप्ट है. अलग-अलग उपयोगकर्ताओं के पास अलग-अलग डेटा होता है. साथ ही, कभी-कभी उनके पास अलग-अलग सुविधाएं भी होती हैं. उदाहरण के लिए, चैट ऐप्लिकेशन में हर मैसेज, उसे बनाने वाले उपयोगकर्ता से जुड़ा होता है. उपयोगकर्ता अपने मैसेज भी मिटा सकते हैं. हालांकि, वे दूसरे उपयोगकर्ताओं के मैसेज नहीं मिटा सकते.

अनुमति देना

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

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read और .write नियम कैस्केड होते हैं. इसलिए, यह नियमों का सेट, पाथ /foo/ के साथ-साथ /foo/bar/baz जैसे किसी भी गहरे पाथ पर मौजूद डेटा को पढ़ने का ऐक्सेस देता है. ध्यान दें कि डेटाबेस में .read और .write नियम, गहरे नियमों को बदल देते हैं. इसलिए, इस उदाहरण में /foo/bar/baz का रीड ऐक्सेस तब भी दिया जाएगा, जब पाथ /foo/bar/baz पर मौजूद नियम का आकलन गलत के तौर पर किया गया हो.

रीयलटाइम डेटाबेस के सुरक्षा नियमों में, पहले से मौजूद वैरिएबल और फ़ंक्शन शामिल होते हैं. इनकी मदद से, अन्य पाथ, सर्वर-साइड टाइमस्टैंप, पुष्टि करने की जानकारी वगैरह का रेफ़रंस दिया जा सकता है. यहां ऐसे नियम का उदाहरण दिया गया है जो पुष्टि किए गए उपयोगकर्ताओं को /users/<uid>/ में लिखने का ऐक्सेस देता है. यहां <uid>, Firebase Authentication से मिला उपयोगकर्ता आईडी है.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

डेटा सत्यापन

Firebase Realtime Database स्कीमा-लेस है. इससे ऐप्लिकेशन डेवलप करने के दौरान, डेटा में आसानी से बदलाव किए जा सकते हैं. हालांकि, ऐप्लिकेशन को डिस्ट्रिब्यूट करने के लिए तैयार होने के बाद, डेटा में कोई बदलाव नहीं होना चाहिए. नियमों की भाषा में एक .validate नियम शामिल होता है. इसकी मदद से, .read और .write नियमों के लिए इस्तेमाल किए गए एक्सप्रेशन का इस्तेमाल करके, पुष्टि करने का लॉजिक लागू किया जा सकता है. अंतर सिर्फ़ इतना है कि पुष्टि करने के नियम कैस्केड नहीं होते. इसलिए, डेटा डालने की अनुमति देने के लिए, पुष्टि करने के सभी ज़रूरी नियमों का आकलन सही के तौर पर होना चाहिए.

इन नियमों से यह लागू होता है कि /foo/ में लिखा गया डेटा, 100 से कम वर्णों वाली स्ट्रिंग होनी चाहिए:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

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

डेटाबेस इंडेक्स तय करना

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

इंडेक्स के बारे में जानकारी देने के लिए, .indexOn नियम का इस्तेमाल किया जाता है. यहां इंडेक्स के एलान का एक उदाहरण दिया गया है. इससे डायनासोर की सूची के लिए, ऊंचाई और लंबाई वाले फ़ील्ड को इंडेक्स किया जाएगा:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

अगले चरण