FlawOpen

flawopen.com/JSON पार्सिंग/JSON.parse() vs eval()

क्या JSON.parse(), eval() से सुरक्षित है?

संदर्भ मार्गदर्शिका
संक्षिप्त उत्तर

इनपुट को एक नोट समझें: JSON.parse() संरचित फ़ॉर्म के फ़ील्ड पढ़ता है, जबकि eval() नोट को इंटरप्रेटर के पास चलाने योग्य निर्देशों की तरह भेजता है। JSON.parse() JSON व्याकरण का पालन करता है और पाठ में मौजूद JavaScript नहीं चलाता; फिर भी, मिले मानों को उपयोग से पहले जाँचना चाहिए।

खतरनाक — पुराना तरीका
// अविश्वसनीय डेटा को प्रोग्राम स्रोत कोड की तरह न चलाएँ।
const data = eval("(" + untrustedJson + ")");
सुरक्षित
const data = JSON.parse(untrustedJson);
// JSON को डेटा की तरह पार्स करें; अमान्य JSON SyntaxError देता है।

यह सवाल क्यों उठता है

JSON.parse() के व्यापक रूप से उपलब्ध होने से पहले, कुछ पुराने JavaScript कोड JSON पढ़ने के लिए eval() का उपयोग करते थे, क्योंकि JSON पाठ और JavaScript अभिव्यक्ति-सिंटैक्स में समानता है। यह तरीका JavaScript प्रोग्राम का मूल्यांकन करता है; इसलिए हमलावर-नियंत्रित इनपुट JSON मानों तक सीमित रहने के बजाय कोड के रूप में लिया जा सकता है। JSON पढ़ने के लिए JSON पार्सर का उपयोग करें।

JSON.parse() किन चीज़ों से अब भी नहीं बचाता

JSON.parse() व्यावसायिक नियमों की जाँच या कार्रवाइयों को अधिकृत नहीं करता, और पार्स किए गए मानों को HTML, SQL, शेल कमांड या URL के लिए सुरक्षित नहीं बनाता। अपेक्षित डेटा संरचना की पुष्टि करें और संदर्भानुसार आउटपुट एन्कोडिंग या पैरामीटरयुक्त API अपनाएँ। यदि reviver दिया जाता है, तो एप्लिकेशन का यह कॉलबैक पार्सिंग के दौरान चलता है; इसे भरोसेमंद, सरल रखें और हमलावर-नियंत्रित मानों पर आधारित साइड इफेक्ट से बचें।

अक्सर पूछे जाने वाले प्रश्न

क्या JSON.parse() एप्लिकेशन कोड चला सकता है?

JSON पाठ स्वयं डेटा के रूप में पार्स होता है, JavaScript के रूप में नहीं चलता। लेकिन यदि एप्लिकेशन reviver देता है, तो यह भरोसेमंद कॉलबैक पार्स किए गए मानों के लिए बुलाया जाता है और कोड चला सकता है। हमलावर-नियंत्रित डेटा को कॉलबैक का चलने योग्य तर्क चुनने या बनाने न दें।

क्या JSON.parse() इनपुट को बाद में उपयोग के लिए सुरक्षित बनाता है?

नहीं। पार्स किए गए मान को एप्लिकेशन की अपेक्षित स्कीमा और अनुमति नियमों के अनुसार जाँचें। HTML के लिए आउटपुट एन्कोडिंग और SQL के लिए पैरामीटरयुक्त क्वेरी उपयोग करें; पार्सिंग इन संदर्भों के लिए डेटा को स्वच्छ नहीं करती।

संदर्भ

यह भी देखें JavaScript प्रोटोटाइप प्रदूषण: कारण और बचाव क्या lodash.merge() prototype pollution से सुरक्षित है? Object.assign() और Prototype Pollution: क्या सुरक्षित है? क्या JSON.parse() प्रोटोटाइप प्रदूषण करता है?