2014-09-22 8 views
10

मुझे लगता है कि यह किसी भी इनपुट पर अविश्वास करने के लिए वेब पर एक प्रसिद्ध सर्वोत्तम अभ्यास है। वाक्यक्या JSON को sanitizing आवश्यक है?

"सभी इनपुट बुरा है।"

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

मेरा सवाल यह है कि, यदि मेरे पास JSN प्राप्त करने और पार्स करने के लिए Node.js सर्वर चल रहा है और body-parser मिडलवेयर है, तो क्या मुझे कोई भी sanitizing चलाने की आवश्यकता है?

मेरा (शायद बेवकूफ़?) इस पर विचार है कि JSON केवल डेटा, कोई कोड नहीं है, और यदि कोई अमान्य JSON भेजता है, तो बॉडी-पार्सर (जो JSON.parse() आंतरिक रूप से उपयोग करता है) वैसे भी असफल हो जाएगा, इसलिए मुझे पता है कि मेरा ऐप होगा एक मान्य जावास्क्रिप्ट ऑब्जेक्ट प्राप्त करें। जब तक मैं उस पर eval नहीं चलाता या एक समारोह बुलाता हूं, मुझे ठीक होना चाहिए, है ना?

क्या मुझे कुछ याद आ रही है?

+2

ऐसा लगता है:


उदाहरण के लिए, यहाँ एक पार्स समारोह है कि गुणों के साथ एक वस्तु की उम्मीद है इन चेकों के कुछ लागू होने वाला है और आप किसी फ़िल्टर किए गए परिणाम यह है कि केवल गुण आप उम्मीद कर रहे थे शामिल देता है मेरे लिए बॉडी पार्सर पहले ही इनपुट को स्वच्छ कर रहा है, इसलिए आपको ऐसा करने की आवश्यकता नहीं है। दूसरी तरफ, इनपुट में कोई नुकसान नहीं होता है जब तक कि यह एक प्रदर्शन बाधा न हो, तब तक दोगुना संवेदीकरण किया जा सकता है। –

उत्तर

14

JSON.parse() के बाद से किसी भी कोड नहीं चलता है चाहता हूँ डेटा में पार्स करने के लिए हो सकता है, तो यह कमजोर रास्ता eval() है नहीं है, लेकिन वहां अभी भी चीजें आप अपने सर्वर और आवेदन की अखंडता की रक्षा करने के लिए क्या करना चाहिए जैसे:

  1. अपवाद संचालक लागू करें उचित स्थान पर JSON.parse() एक अपवाद फेंक सकता है।
  2. इस बारे में धारणा न करें कि डेटा क्या है, आपको इसका उपयोग करने से पहले डेटा के लिए स्पष्ट रूप से परीक्षण करना होगा।
  3. केवल उन्हीं गुणों को संसाधित करें जिन्हें आप विशेष रूप से ढूंढ रहे हैं (जेएसओएन में हो सकता है कि अन्य चीजों से परहेज करें)।
  4. सभी आने वाले डेटा को वैध, स्वीकार्य मानों के रूप में मान्य करें।
  5. डेटा की लंबाई को स्वच्छ करें (अत्यधिक बड़े डेटा वाले डॉस मुद्दों को रोकने के लिए)।
  6. इस आने वाले डेटा को उन स्थानों पर न रखें जहां इसे सीधे पृष्ठ के एचटीएमएल में या सीधे एसक्यूएल स्टेटमेंट में इंजेक्शन दिया जा सके ताकि यह सुनिश्चित किया जा सके कि यह उस पर्यावरण के लिए सुरक्षित है।

तो, सीधे अपने प्रश्न का उत्तर देने के लिए, "हां" केवल शरीर-पारसर का उपयोग करने से कहीं अधिक है, हालांकि यह डेटा को पहले प्रोसेस करने के लिए बिल्कुल सही फ्रंट लाइन है। एक बार जब आप इसे शरीर-पारसर से प्राप्त करते हैं, तो डेटा के साथ आप जो भी कदम उठाते हैं, उसके लिए अगले चरण कई मामलों में मायने रखते हैं और अतिरिक्त देखभाल की आवश्यकता हो सकती है।

// pass expected list of properties and optional maxLen 
// returns obj or null 
function safeJSONParse(str, propArray, maxLen) { 
    var parsedObj, safeObj = {}; 
    try { 
     if (maxLen && str.length > maxLen) { 
      return null; 
     } else { 
      parsedObj = JSON.parse(str); 
      if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) { 
       safeObj = parseObj; 
      } else { 
       // copy only expected properties to the safeObj 
       propArray.forEach(function(prop) { 
        if (parsedObj.hasOwnProperty(prop)) { 
         safeObj[prop] = parseObj[prop]; 
        } 
       }); 
      } 
      return safeObj; 
     } 
    } catch(e) { 
     return null; 
    } 
} 
4

आपको ठीक होना चाहिए। जेएसओएन के शुरुआती उपयोगकर्ता प्रायः प्राप्त स्ट्रिंग पर eval() को कॉल करेंगे, जो निश्चित रूप से एक विशाल सुरक्षा छेद है। लेकिन जैसा कि आप कहते हैं, JSON.parse, इस तरह के अधिकांश प्रकार की सैनिटी चेक को संभालता है।

जब तक आप सुनिश्चित करते हैं कि प्राप्त JSON ऑब्जेक्ट से कुछ न लेना और सीधे इसे एक SQL क्वेरी में पास करना है, उदाहरण के लिए, आपको ठीक होना चाहिए।

+2

एक जेएसओएन से सीधे कुछ एसक्यूएल क्वेरी में से गुज़रने के संकेत के साथ संकेत विशेष रूप से मूल्यवान है, इसके लिए धन्यवाद :-)! –

2

जब तक आप JSON.parse कोई कोड

मूल्यांकन किया जाएगा तुम अब भी किसी भी कुंजी श्वेत सूची में डालने चाहिए का उपयोग कर रहे: मान युग्म आप पार्स परिणाम से स्वीकार करने के लिए हालांकि

+4

'JSON.parse' के कुछ पॉलीफिल (जैसे क्रॉकफ़ोर्ड [json2.js] (https://github.com/douglascrockford/JSON-js/blob/master/json2.js)) 'eval' का उपयोग करें)। – Oriol

+3

उल्लेख के लिए धन्यवाद, लेकिन समाधान सरल है: इसका उपयोग न करें। – naomik

+3

@ ओरियल - इसके अलावा, यह प्रश्न विशेष रूप से कोड के बारे में है जो वास्तविक 'JSON.parse() 'node.js. में उपयोग करता है। यहां शामिल कोई पॉलीफिल नहीं है। – jfriend00

संबंधित मुद्दे