javascript - क्या Firebase apiKey को जनता के सामने उजागर करना सुरक्षित है?




firebaseui (3)

Firebase Web-App मार्गदर्शिका में कहा गया है कि मुझे अपने Html में फ़ायरबेज़ को आरंभ करने के लिए दिए गए apiKey को रखना चाहिए:

// TODO: Replace with your project's customized code snippet
<script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: '<your-api-key>',
    authDomain: '<your-auth-domain>',
    databaseURL: '<your-database-url>',
    storageBucket: '<your-storage-bucket>'
  };
  firebase.initializeApp(config);
</script>

ऐसा करने से एपीके प्रत्येक आगंतुक के सामने आ जाता है। उस कुंजी का उद्देश्य क्या है और क्या यह वास्तव में सार्वजनिक होना है?


ApiKey अनिवार्य रूप से Google सर्वर पर आपके Firebase प्रोजेक्ट की पहचान करता है। इसे जानना किसी के लिए सुरक्षा जोखिम नहीं है। वास्तव में, उनके लिए यह जानना आवश्यक है, ताकि वे आपके फायरबेस प्रोजेक्ट के साथ बातचीत कर सकें।

उस अर्थ में यह डेटाबेस URL के समान है जिसे Firebase ऐतिहासिक रूप से बैक-एंड: https://<app-id>.firebaseio.com पहचान करने के लिए उपयोग किया गया है। यह सवाल देखें कि यह सुरक्षा जोखिम क्यों नहीं है: फायरबेस डेटा संशोधन को कैसे प्रतिबंधित किया जाए? सहित, Firebase के सर्वर साइड सुरक्षा नियमों का उपयोग केवल यह सुनिश्चित करने के लिए कि अधिकृत उपयोगकर्ता बैकएंड सेवाओं तक पहुंच सकते हैं।

यदि आप सीखना चाहते हैं कि आपके फायरबेस बैकएंड सेवाओं के लिए सभी डेटा एक्सेस को कैसे सुरक्षित किया जाए, तो फायरब्रिगेड सुरक्षा नियमों पर प्रलेखन पर पढ़ें।


जब उपयोगकर्ता / पासवर्ड साइन अप सक्षम होता है तो एपीआई कुंजी एक्सपोज़र एक भेद्यता बनाता है। एक खुला एपीआई एंडपॉइंट है जो एपीआई कुंजी लेता है और किसी को भी एक नया उपयोगकर्ता खाता बनाने की अनुमति देता है। वे तब इस नए खाते का उपयोग अपने फायरबेस प्रामाणिक संरक्षित ऐप में लॉग इन करने के लिए कर सकते हैं या उपयोगकर्ता / पास और प्रश्नों को चलाने के लिए एसडीके का उपयोग कर सकते हैं।

मैंने Google को इसकी सूचना दी है, लेकिन वे कहते हैं कि यह इच्छानुसार काम कर रहा है।

यदि आप उपयोगकर्ता / पासवर्ड खातों को अक्षम नहीं कर सकते हैं, तो आपको निम्नलिखित कार्य करने चाहिए: नए उपयोगकर्ताओं को अक्षम करने के लिए ऑटो में क्लाउड फ़ंक्शन बनाएं और उनकी पहुंच को प्रबंधित करने के लिए एक नया DB प्रविष्टि बनाएं।

Ex: MyUsers / {userId} / Access: 0

 exports.addUser = functions.auth.user().onCreate(onAddUser); exports.deleteUser = functions.auth.user().onDelete(onDeleteUser); 

केवल>> 1 वाले उपयोगकर्ताओं के लिए रीड्स की अनुमति देने के लिए अपने नियमों को अपडेट करें।

बंद मौका पर श्रोता फ़ंक्शन खाते को तेज़ी से अक्षम नहीं करता है, तो रीड नियम उन्हें किसी भी डेटा को पढ़ने से रोक देगा।


यहां प्रूफ्रोफ्रो और फ्रैंक वैन पफलेन के उत्तर पर निर्माण, मैंने इस समाधान को एक साथ रखा है जो स्क्रैपिंग को रोकता नहीं है, लेकिन आपकी एपीआई कुंजी का उपयोग करना कठिन बना सकता है।

चेतावनी: अपना डेटा प्राप्त करने के लिए, यहां तक ​​कि इस विधि के साथ, उदाहरण के लिए, क्रोम में जेएस कंसोल को केवल खोलें और टाइप करें:

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});

केवल डेटाबेस सुरक्षा नियम आपके डेटा की सुरक्षा कर सकते हैं।

फिर भी, मैंने अपने उत्पादन एपीआई कुंजी का उपयोग इस तरह अपने डोमेन नाम तक सीमित रखा:

  1. https://console.developers.google.com/apis
  2. अपना फायरबेस प्रोजेक्ट चुनें
  3. साख
  4. एपीआई कुंजी के तहत, अपनी ब्राउज़र कुंजी चुनें। यह इस तरह दिखना चाहिए: " ब्राउज़र कुंजी (Google सेवा द्वारा बनाया गया ऑटो) "
  5. " इन HTTP रेफ़रर्स (वेब ​​साइटों) से अनुरोध स्वीकार करें " में, अपने एप्लिकेशन का URL जोड़ें (उदाहरण: projectname.firebaseapp.com/* )

अब ऐप केवल इस डोमेन नाम पर काम करेगा। इसलिए मैंने एक और API कुंजी बनाई जो स्थानीयहोस्ट डेवलपमेंट के लिए निजी होगी।

  1. क्रेडेंशियल बनाएँ> एपीआई कुंजी पर क्लिक करें

यह एक प्रतिबंधित नहीं है, इसलिए सुनिश्चित करें कि आप इसे निजी रखें।

डिफ़ॉल्ट रूप से, जैसा कि इमैनुएल कैंपोस ने उल्लेख किया है, support.google.com/firebase/answer/6400741

यह सुनिश्चित करने के लिए कि मैं गलती से इस नई अप्रतिबंधित एपीआई कुंजी को प्रकाशित नहीं करता हूं, मैं उत्पादन में प्रतिबंधित एक का उपयोग करने के लिए निम्न विधियों में से एक का उपयोग करता हूं।

Create-React-App के लिए सेटअप

/env.development :

plugins: [
    new CopyWebpackPlugin([
      {
        transform: function(content, path) {
          return content.toString().replace("###dev-key###", "###public-key###");
        },
        from: './index.html'
      }
    ])
  ]

/env.production :

exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);

में /src/index.js

 const firebaseConfig = { apiKey: process.env.REACT_APP_API_KEY, // ... }; 

वेबपैक के लिए मेरा पिछला सेटअप:

मैं अपने उत्पादन ऐप को बनाने के लिए वेबपैक का उपयोग करता हूं और मैंने अपनी देव एपीआई कुंजी को अपने index.html अंदर डाल दिया है, जैसा कि आप सामान्य रूप से करते हैं। उसके बाद, मेरे webpack.production.config.js फ़ाइल के अंदर, मैं हर बार index.html कुंजी को उत्पादन बिल्ड में कॉपी करता हूं:

 plugins: [ new CopyWebpackPlugin([ { transform: function(content, path) { return content.toString().replace("###dev-key###", "###public-key###"); }, from: './index.html' } ]) ] 






firebase