00:00:00इस महीने एक रिपोर्ट आई है जिसमें लगभग 20,000 इंडी ऐप्स को स्कैन किया गया और पाया गया कि नौ में से एक
00:00:04ऐप अपने फ्रंट-एंड कोड में सुपा-आधारित (Supa-based) क्रेडेंशियल्स को एक्सपोज़ कर रहे थे।
00:00:08यह किसी सर्वर लॉग या प्राइवेट रेपो की बात नहीं है।
00:00:11यह सीधे उस जावास्क्रिप्ट में है जिसे हर विजिटर डाउनलोड करता है।
00:00:14और बात यह है कि ये ऐप्स हैक नहीं हुए थे, उन्होंने बस गलती से अपनी सीक्रेट कीज़ सार्वजनिक कर दीं।
00:00:18साफ कर दूँ कि कुछ कीज़ (keys) सार्वजनिक होने के लिए ही होती हैं।
00:00:21असली समस्या पाइपलाइन की है, क्योंकि उसी गलती से ऐसी की (key) भी शिप हो सकती है जिसे ब्राउज़र में
00:00:25कभी होना ही नहीं चाहिए था।
00:00:27हमारे वीडियो हर समय आते रहते हैं।
00:00:28सब्सक्राइब करना न भूलें।
00:00:35यहाँ एक सरल सच्चाई है जिसमें लोग अक्सर उलझ जाते हैं।
00:00:38हम सभी इसे जानते तो हैं, लेकिन जल्दबाजी में अक्सर चूक जाते हैं।
00:00:41जब आप किसी एनवायरनमेंट वेरिएबल को पब्लिक के रूप में मार्क करते हैं, तो आपका बिल्ड टूल उसे ब्राउज़र का हिस्सा
00:00:46मान लेता है और उसे क्लाइंट बंडल में जोड़ दिया जाता है।
00:00:50Next.js इसे Next.public के साथ करता है, Vite इसे Vite के साथ और SvelteKit इसे public
00:00:56का उपयोग करके करता है।
00:00:57Next कोई सेफ्टी लेबल नहीं है, वह असल में एक शिपिंग लेबल है।
00:01:01अब हम यह तो जानते हैं, लेकिन यहाँ सुपा-आधारित हिस्सा यह है।
00:01:04कुछ कीज़ पब्लिक होने के लिए होती हैं, जैसे एनॉन (anon) या पब्लिशेबल की, और कुछ प्राइवेट होती हैं, जैसे
00:01:10सर्विस रोल या सीक्रेट कीज़।
00:01:12अगर कोई प्राइवेट की ब्राउज़र में पहुँच जाती है, तो आप अंदाज़ा लगा सकते हैं कि क्या होगा।
00:01:17उस स्थिति में रोल लेवल सिक्योरिटी (RLS) भी आपको नहीं बचा पाएगी।
00:01:20सुपा-बेस्ड के डॉक्स में साफ लिखा है कि सर्विस कीज़ RLS को बायपास कर सकती हैं।
00:01:24तो अगर वह की आपके फ्रंट-एंड में है, तो आपकी सारी पॉलिसी सेटिंग्स का कोई मतलब नहीं रह जाता।
00:01:29अब मैं आपको अपने सैंडबॉक्स का उपयोग करके दिखाता हूँ कि वास्तव में यह कैसे हुआ।
00:01:33सबसे पहले, मैंने Next.js का उपयोग करके एक साधारण CRUD ऐप बनाया और उसमें अपना सुपा-बेस्ड लिंक किया।
00:01:38यह रही मेरी EMV फाइल, और यहाँ है वो गलती।
00:01:41मैंने एक की (key) को पब्लिक प्रीफिक्स वाले वेरिएबल में डाल दिया।
00:01:45यह की पब्लिशेबल है, इसलिए इसका दिखना सामान्य है।
00:01:48असली समस्या यह है कि वही Next.public वाला रास्ता गलती से एक प्राइवेट की को भी शिप कर सकता है।
00:01:53जब मैंने इसे बनाने के लिए npm run build चलाया और फिर अपना ऐप शुरू किया।
00:01:59अब मैं यहाँ क्रोम में हूँ।
00:02:00चलिए जल्दी से हमारे डेटाबेस, यानी हमारे CRUD ऐप में कुछ जानकारी जोड़ते हैं।
00:02:05ठीक है, अब मैं कंपाइल किए गए जावास्क्रिप्ट बंडल को खोल सकता हूँ और उसमें सर्च करूँगा।
00:02:10यह रही।
00:02:12URL और की (key) ठीक उसी फाइल के अंदर हैं जिसे आपके यूजर्स ने अपने ब्राउज़र में
00:02:18पुल किया है।
00:02:19और ध्यान दें कि यहाँ क्या नहीं हुआ।
00:02:21किसी ने इसे हैक नहीं किया।
00:02:22मैंने इसे ढूँढ लिया, है ना?
00:02:24किसी ने किसी कमज़ोरी का फायदा नहीं उठाया।
00:02:25यह बस उस चीज़ को पढ़ना है जिसे ऐप ने पहले ही सार्वजनिक इंटरनेट पर भेज दिया था।
00:02:29अगर आप इसे देख सकते हैं, तो कोई भी देख सकता है।
00:02:32देव टूल्स (dev tools) खोलें, जावास्क्रिप्ट फाइलें देखें और इसे सर्च करें।
00:02:35बस इतना ही करना है।
00:02:36तो अगर आपका प्लान यह है कि कोई नहीं देखेगा, तो याद रखें कि इंटरनेट ऐसे लोगों और बॉट्स से भरा है
00:02:41जिनका काम ही ऐसी चीज़ों को ढूँढना है।
00:02:44तो यहाँ वो समाधान है जो वास्तव में काम करता है।
00:02:47ब्राउज़र को केवल आपके API को कॉल करना चाहिए।
00:02:50आपका API सर्वर साइड पर चलता है।
00:02:52प्राइवेट कीज़ वहीं रहती हैं।
00:02:54प्राइवेट ऑपरेशन्स को API रूट या सर्वर फंक्शन में ले जाएँ।
00:02:58क्लाइंट आपके एंडपॉइंट को कॉल करता है, आपका एंडपॉइंट सुप्राबेस को कॉल करता है, फिर बंडल को दोबारा बनाएँ और चेक करें।
00:03:03अगर की (key) बंडल से हट गई है, तो आपने इसे ठीक कर दिया है, लेकिन बस यहीं रुककर
00:03:04काम खत्म न समझें, क्योंकि और भी चीज़ें हैं जो आप कर सकते हैं।
00:03:09सुनिश्चित करें कि यूजर-फेसिंग टेबल्स के लिए रोल लेवल सिक्योरिटी इनेबल हो और आपकी पॉलिसी
00:03:11वही कर रही हों जो आप चाहते हैं।
00:03:16टेस्टिंग में भी कुछ समय बिताएं।
00:03:18मुझे लगता है कि अक्सर इस बात को नज़रअंदाज़ कर दिया जाता है।
00:03:19अब वो हिस्सा जो इसे दोबारा होने से रोकता है: ज्यादातर लोग इसे एक बार ठीक करते हैं, फिर
00:03:21जल्दबाजी में इसे फिर से शामिल कर देते हैं।
00:03:26इसलिए कुछ सुरक्षा घेरे (guard rails) जोड़ें, CI में सीक्रेट स्कैनिंग से शुरुआत करें ताकि अगर कोई की
00:03:28गलत जगह दिखे तो बिल्ड फेल हो जाए।
00:03:34फिर एक PR नियम बनाएँ कि next public या Vite वाली किसी भी चीज़ को डिफॉल्ट रूप से पब्लिक माना जाए
00:03:36क्योंकि वह पब्लिक ही होती है।
00:03:41अंत में, रोटेशन की व्यवस्था करें।
00:03:42अगर आपको ज़रा सा भी अंदेशा हो कि कीज़ एक्सपोज़ हुई हैं, तो उन्हें तुरंत बदल (rotate) दें।
00:03:43कुछ दिनों तक इंतज़ार करके देखने से यह कहीं बेहतर है।
00:03:47यहाँ वो चीज़ है जिसे आप अभी आज़मा सकते हैं।
00:03:50अपने ऐप को उसी तरह बिल्ड करें जैसे आप इसे शिप करते हैं।
00:03:52आउटपुट में सुपरबेस JWT सर्विस सीक्रेट और टोकन जैसी दिखने वाली किसी भी चीज़ को सर्च करें।
00:03:55अगर आपको कुछ भी प्राइवेट मिले, तो मान लें कि वह कॉम्प्रोमाइज़ हो चुका है क्योंकि आपने उसे ढूँढ लिया है।
00:04:01उसे बदलें और फिर अपने सर्वर-साइड लॉजिक को अपडेट करें।
00:04:05अगर आप इस वीडियो से सिर्फ एक लाइन याद रखना चाहते हैं, तो वो यह है।
00:04:08अगर वह बंडल में है, तो वह पब्लिक है।
00:04:11मिलते हैं अगले वीडियो में।
00:04:13We'll see you in another video.