वेब सुरक्षा की दुनिया में, प्रोटोटाइप प्रदूषण एक सूक्ष्म लेकिन संभावित रूप से विनाशकारी भेद्यता है जिसे अगर ठीक से संबोधित नहीं किया गया तो गंभीर परिणाम हो सकते हैं। इस ब्लॉग में, हम जानेंगे कि प्रोटोटाइप प्रदूषण क्या है, यह कैसे होता है, और सबसे महत्वपूर्ण बात यह है कि इसे कैसे रोका जाए। आइए गोता लगाएँ!
प्रोटोटाइप प्रदूषण एक प्रकार की भेद्यता है जो जावास्क्रिप्ट अनुप्रयोगों को प्रभावित करती है। यह तब होता है जब कोई हमलावर किसी ऑब्जेक्ट के प्रोटोटाइप में गुणों को इंजेक्ट करने में सक्षम होता है, जो तब इस प्रोटोटाइप से प्राप्त सभी ऑब्जेक्ट्स में फैल सकता है। इससे अप्रत्याशित व्यवहार हो सकता है, जिसमें मौजूदा तरीकों और गुणों को अधिलेखित करने की क्षमता, अंततः एप्लिकेशन की सुरक्षा और कार्यक्षमता से समझौता करना शामिल है।
यह समझने के लिए कि प्रोटोटाइप प्रदूषण कैसे होता है, हमें जावास्क्रिप्ट ऑब्जेक्ट और प्रोटोटाइप पर करीब से नज़र डालने की ज़रूरत है। जावास्क्रिप्ट में, प्रत्येक ऑब्जेक्ट का एक प्रोटोटाइप होता है, जो एक अन्य ऑब्जेक्ट होता है जिसमें से पहला ऑब्जेक्ट गुण और विधियाँ प्राप्त करता है। यह प्रोटोटाइप चेनिंग कुशल संपत्ति लुकअप की अनुमति देती है लेकिन अगर सही ढंग से नहीं संभाली गई तो संभावित हमलों के लिए भी द्वार खोलती है।
यहां एक सरल उदाहरण दिया गया है कि प्रोटोटाइप प्रदूषण कैसे हो सकता है:
let obj = {}; console.log(obj.constructor); // function Object() { [native code] } obj.__proto__.polluted = true; console.log({}.polluted); // true
इस उदाहरण में, ओबीजे की प्रोटो संपत्ति को संशोधित करके, हम अनजाने में समान प्रोटोटाइप साझा करने वाली सभी वस्तुओं को प्रभावित करते हैं, यह प्रदर्शित करते हुए कि प्रोटोटाइप श्रृंखला को प्रदूषित करना कितना आसान है।
प्रोटोटाइप प्रदूषण का वास्तविक विश्व उदाहरण
ऐसे परिदृश्य पर विचार करें जहां उपयोगकर्ता इनपुट का उपयोग उचित सत्यापन के बिना वस्तुओं को विस्तारित या मर्ज करने के लिए किया जाता है। एक सामान्य उपयोग का मामला क्वेरी पैरामीटर्स को कॉन्फ़िगरेशन ऑब्जेक्ट में मर्ज करना है।
const merge = require('lodash/merge'); let config = {}; let query = JSON.parse('{"__proto__":{"admin":true}}'); merge(config, query); console.log(config.admin); // undefined console.log({}.admin); // true
इस उदाहरण में, लॉडैश लाइब्रेरी से मर्ज फ़ंक्शन का उपयोग कॉन्फ़िगरेशन को क्वेरी के साथ संयोजित करने के लिए किया जाता है। हालाँकि, हमलावर-नियंत्रित क्वेरी ऑब्जेक्ट में एक proto प्रॉपर्टी शामिल होती है जो वैश्विक ऑब्जेक्ट प्रोटोटाइप को प्रदूषित करती है, सभी ऑब्जेक्ट के लिए एडमिन को सही पर सेट करती है।
अपने अनुप्रयोगों को प्रोटोटाइप प्रदूषण से सुरक्षित रखने के लिए, निम्नलिखित उपायों को लागू करने पर विचार करें:
1. मूल प्रोटोटाइप का विस्तार करने से बचें:
मूल प्रोटोटाइप (उदाहरण के लिए, ऑब्जेक्ट.प्रोटोटाइप) का सीधे विस्तार न करें, क्योंकि इससे टकराव और सुरक्षा कमजोरियाँ पैदा हो सकती हैं।
उदाहरण: मूल प्रोटोटाइप का विस्तार करने से बचें
ऐसा करने से बचें:
Object.prototype.polluted = true; // Extending native prototype let obj = {}; console.log(obj.polluted); // true
इसके बजाय, अपने नामस्थान में उपयोगिता विधियां बनाएं:
const myUtils = { polluted: function() { // Your method implementation } }; let obj = {}; console.log(obj.polluted); // undefined
2. उपयोगकर्ता इनपुट मान्य करें:
वस्तुओं के निर्माण या संशोधन के लिए उपयोगकर्ता इनपुट का उपयोग करने से पहले उसे हमेशा सत्यापित और स्वच्छ करें। सख्त इनपुट सत्यापन नियमों को लागू करने के लिए जॉय या वैलिडेटर जैसी लाइब्रेरी का उपयोग करें।
उदाहरण: जॉय का उपयोग करके उपयोगकर्ता इनपुट को मान्य करें
const Joi = require('joi'); const schema = Joi.object({ admin: Joi.boolean().required() }); const input = JSON.parse('{"admin":true}'); const { error, value } = schema.validate(input); if (error) { console.error('Invalid input:', error.details); } else { console.log('Valid input:', value); }
3. सुरक्षित वस्तु विधियों का उपयोग करें:
सुरक्षित ऑब्जेक्ट विधियों का उपयोग करना पसंद करें जो प्रोटोटाइप श्रृंखला को पार नहीं करते हैं, जैसे प्रोटोटाइप के बिना सादे ऑब्जेक्ट बनाने के लिए ऑब्जेक्ट.क्रिएट (null)।
उदाहरण: सुरक्षित वस्तु विधियों का उपयोग करें
let safeObj = Object.create(null); safeObj.admin = false; console.log(safeObj.constructor); // undefined console.log(safeObj.admin); // false
4. प्रोटोटाइप को फ़्रीज़ करें:
प्रोटोटाइप श्रृंखला में संशोधनों को रोकने के लिए ऑब्जेक्ट.प्रोटोटाइप को फ़्रीज़ करें। यह object.freeze() का उपयोग करके किया जा सकता है।
उदाहरण: प्रोटोटाइप को फ़्रीज़ करना
Object.freeze(Object.prototype); let obj = {}; try { obj.__proto__.polluted = true; } catch (e) { console.error('Attempt to modify prototype failed:', e); } console.log({}.polluted); // undefined
5. अद्यतन निर्भरताएँ:
यह सुनिश्चित करने के लिए कि आप सुरक्षा पैच सहित नवीनतम संस्करणों का उपयोग कर रहे हैं, अपनी निर्भरता को नियमित रूप से अपडेट करें। प्रोटोटाइप प्रदूषण हमलों के लिए अक्सर तीसरे पक्ष के पुस्तकालयों में कमजोरियों का फायदा उठाया जाता है।
उदाहरण: npm का उपयोग करके निर्भरता को अद्यतन करना
npm update
यह सुनिश्चित करने के लिए कि आपके सभी पैकेज अद्यतित हैं, इस आदेश को नियमित रूप से चलाएँ।
6. मॉनिटर और परीक्षण:
प्रोटोटाइप प्रदूषण कमजोरियों का पता लगाने और उन्हें कम करने के लिए निगरानी और स्वचालित परीक्षण लागू करें। एनपीएम ऑडिट जैसे उपकरण आपके प्रोजेक्ट में कमजोर पैकेजों की पहचान करने में मदद कर सकते हैं।
उदाहरण: एनपीएम ऑडिट के साथ निगरानी और परीक्षण
npm audit
अपने प्रोजेक्ट की कमजोरियों को स्कैन करने के लिए यह कमांड चलाएँ। यह पाई गई समस्याओं की एक रिपोर्ट प्रदान करता है और समाधान के कदम सुझाता है।
प्रोटोटाइप प्रदूषण एक गंभीर भेद्यता है जिस पर ध्यान न दिए जाने पर दूरगामी परिणाम हो सकते हैं। यह कैसे होता है इसे समझकर और इसे रोकने के लिए सर्वोत्तम प्रथाओं को लागू करके, आप अपने जावास्क्रिप्ट अनुप्रयोगों की सुरक्षा को महत्वपूर्ण रूप से बढ़ा सकते हैं। सतर्क रहें, अपनी निर्भरताएँ अद्यतन रखें, और इस घातक आक्रमण वेक्टर से सुरक्षा के लिए हमेशा उपयोगकर्ता इनपुट को मान्य करें।
यदि आपको यह ब्लॉग उपयोगी लगा, तो इसे अपने साथी डेवलपर्स और सुरक्षा उत्साही लोगों के साथ साझा करना सुनिश्चित करें। मजबूत वेब सुरक्षा बनाए रखने के लिए सूचित और सक्रिय रहना महत्वपूर्ण है। हैप्पी कोडिंग!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3