2013-02-06 11 views
26

क्यों गूगल/फेसबुक आदि जैसे unparseable cruft जोड़ने के लिए के रूप में this प्रश्न पढ़ने के बाद:JSON अयोग्य क्रूर: इतना गंभीर क्यों?

  • while(1);
  • for(;;);
  • &&&START&&& ... &&&END&&&
  • 1 और 3 उनके JSON के

संयुक्त प्रतिक्रियाएं, मैंने प्रेरणा को समझ लिया है। लेकिन मैं अभी भी क्यों इस तरह के अपेक्षाकृत जटिल तंत्र उपयोग किया जाता है जबकि इसी तरह के प्रभाव की तरह

  • में सिंटेक्स त्रुटि
  • के साथ पूरे पंक्ति अमान्य प्रतिपादन के लिए शुरुआत में एक अतिरिक्त ) जोड़ने चीजों के साथ प्राप्त किया जा सकता है के रूप में स्पष्ट नहीं कर रहा हूँ
  • टिप्पणी

अब में JSON लपेटकर, यह है कि यह अतिरिक्त अनंत लूप और (अजीब) सिंटैक्स त्रुटि के संरक्षण के चारों ओर बड़े और अनुमोदक जावास्क्रिप्ट पारसर्स प्राप्त करने के लिए किया जाएगा लगता है, लेकिन मैं यह दर्शाता है कोई संदर्भ खोजने के लिए नहीं कर पा रहे यह मामला है। एक और SO question है जो while(1); वर्कअराउंड को भी भंग करने के लिए चला जाता है (1 को बताया जा सकता है) और फॉर्म {}&& के दूसरे कार्यप्रणाली को अस्वीकार कर दिया गया है, लेकिन यह बताता नहीं है कि किसी भी स्रोत का उद्धरण क्यों करें या उद्धृत करें।

अन्य संदर्भ:

+0

क्या यह सिर्फ मुझे है या यह अस्पष्टता के माध्यम से सुरक्षा की तरह महसूस करता है और किसी भी स्वीकार्य लिखित एक्सएसएस शोषण के लिए भी कोई समस्या नहीं होगी? JSON.parse() वास्तव में eval() कहते हैं? –

+0

एक संबंधित सवाल यह है कि वे सिर्फ सरणी के बजाय JSON ऑब्जेक्ट्स क्यों नहीं लौटते हैं। किसी ऑब्जेक्ट को लौटने से पूरी तरह से वैध JSON उत्पन्न होता है जो वैध जावास्क्रिप्ट नहीं है, जो क्लीनर तरीके से JSON अपहरण को रोकता है। संभावित उत्तर यह है कि ये सेवाएं बैंडविड्थ को बचाने के लिए जितना संभव हो सके कॉम्पैक्ट प्रारूप के रूप में वापस लौटने का प्रयास कर रही हैं। अधिकांश वेब सेवाएं काफी बड़े पैमाने पर संचालित नहीं होती हैं और अनुकूलन के इस स्तर से बच सकती हैं। –

उत्तर

10

मुझे लगता है कि unparseable cruft के रूपों के लिए प्रासंगिक कई विवरण देखते हैं:

  • {}&& लगाकर दिनांकों वापस JSON Parsers (जाहिरा तौर पर पुराने संस्करणों में उदाहरण डोजो के लिए &) JSON स्ट्रिंग मान्य नहीं के रूप में मान्य करने के लिए JSON वाक्य - विन्यास। सभी JSON पार्सर लाइब्रेरीज़ जिन्हें मैं आजकल सत्यापन के बारे में जानता हूं, लेकिन 2008 से this blog post बताता है कि डोजो के कहा गया संस्करण JSON.parse सामान्य रूप से जेसन की अनुमति देगा, जबकि eval बस असफल हो जाएगा, जो आपको JSON अपहरण के विरुद्ध सुविधाजनक सुरक्षा प्रदान करेगा।

  • while(1)Number प्रोटोटाइप का उपयोग कर अप्रभावी बनाया जा सकता है, 1 के मूल्य के रूप में 0 बताए द्वारा।

  • for(;;) और while(1) दोनों का अपहरण कर लिया साइट है, जो अब तक सुरक्षा के लिए जोड़ता है के रूप में किसी भी स्क्रिप्ट के हर आगे निष्पादन को प्रभावी ढंग से बिना किसी त्रुटि के बंद हो जाता है के क्रैश होने का प्रभाव है। यह महत्वपूर्ण है क्योंकि परिभाषा द्वारा एक त्रुटि जावास्क्रिप्ट में स्क्रिप्ट निष्पादन के अंत को चिह्नित नहीं करती है, जबकि for(;;) सुनिश्चित करता है कि इसके बाद कोई भी स्क्रिप्ट निष्पादित नहीं की जाती है। यह (afaik hypothetical) स्थितियों को रोकने के लिए है जहां एक हमलावर window.onerror में कमजोरियों का शोषण करके eval, या प्रॉक्सीइंग त्रुटि ऑब्जेक्ट तत्काल (जैसे constructorError.prototype पर ओवरराइट करने की तरह) को कमजोरियों का शोषण करके सफलतापूर्वक स्क्रिप्ट त्रुटियों को रोकता है।

    अद्यतन

    वहाँ भी है this question on security.stackexchangefor(;;) या while(1) के बाद से यह आपकी साइट गर्भित किया जा सकता है का उपयोग नहीं करने का सुझाव दे डॉस हमला ग्राहकों CPU या मैलवेयर स्कैनर ट्रिगर है। मुझे आधुनिक ब्राउज़र के साथ गंभीर डीओएस समस्या नहीं दिखाई दे रही है, क्योंकि वे सैंडबॉक्स किए गए हैं और प्रति-टैब बेसिस पर चलते हैं। लेकिन यह सुनिश्चित है कि पुराने ब्राउज़र के साथ एक समस्या है। मैलवेयर स्कैनर एक वास्तविक समस्या है और हम आपकी साइट पर हमला करने की रिपोर्ट कर सकते हैं।

  • &&&START&&& (और एक इसी &&&END&&& टैग) क्लाइंट की तरफ पार्स json आसान प्राप्त सिर्फ ) या टिप्पणियां करना अनजाने बंद हो सकता है का उपयोग करने से है, और प्रोग्रामर के लिए पठनीयता & दृश्यता में सुधार हो सकता है। टिप्पणियों में लपेटना सिर्फ उसमें एक भिन्नता है, क्योंकि यह /* प्रारंभ और */ एंड टैग प्रदान करता है। मेरी राय में, शुरुआत और अंत में एक विशिष्ट और स्पष्ट चिह्न क्रूर के अर्थ को ध्यान में रखने में मदद करता है। टिप्पणियों का उपयोग वास्तव में यह उपलब्ध नहीं है।

3

के बारे में '1 clobbered जा सकता है' में एक लपेटकर JSON पता चलता है:

अगर आप निम्नलिखित (वेबकिट में):

var test = 1; 
console.log(test.constructor == window.Number); //true is logged 

सिद्धांत रूप में वहाँ एक संभावना हो सकती है, window.Number या अपने प्रोटोटाइप को संशोधित करने के लिए एक रास्ता है कि वहाँ इतना है कि 1 का मूल्य 1 नहीं होगा:

window.Number.prototype.toString = function() { return 0 }; 
window.Number.prototype.valueOf = function() { return 0 }; 

इस सौभाग्य से काम नहीं करता। लेकिन मुझे लगता है कि लेखक क्या कहने की कोशिश करता है।

संपादित आम तौर पर मैं भी जहां एक टिप्पणी में सामग्री लपेट (लेकिन तब यह सुनिश्चित किया जाना चाहिए कि आपके json वस्तु इस {"test":"*/"} की तरह कुछ शामिल नहीं है दृष्टिकोण का उपयोग करने क्योंकि यह एक सिंटैक्स त्रुटि पैदा करेगा जाते हैं फिर भी। यहां तक ​​कि एक फेंकने वाली त्रुटि संभवतः एक समस्या हो सकती है, अगर यह पकड़ने योग्य हो और शायद उस लाइन के बारे में कुछ जानकारी सामने आती है जहां त्रुटि खुशी होती है या यदि त्रुटि ऑब्जेक्ट स्वयं बदला जा सकता है।

+0

एम्बेडेड "* /" के बारे में अच्छा बिंदु, वास्तव में – Manav

+0

के बारे में सोचा नहीं था, वास्तव में सिंटैक्स त्रुटि लीकिंग जानकारी के बारे में आपका बिंदु शायद यही कारण है कि केवल एक अवैध स्ट्रिंग के साथ JSON को उपसर्ग करना एक बुरा विचार है।इसलिए जो मैंने पहले विकल्प को निर्दिष्ट किया है (जेएसओएन से पहले एक सरल ') 'उपसर्ग का उपयोग करके) मैंने सुझाव दिया है, लेकिन फिर' &&& START &&& ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& – Manav

+0

@ मणव अच्छी तरह से एक बात है, लेकिन यह सिर्फ एक अनुमान है कि '&&& START &&&' के साथ संयोजन में '(;;)' या 'जबकि (1)' का उपयोग करके स्क्रिप्ट के निष्पादन को रोकने का प्रयास करना है, वक्य रचना त्रुटि। और यदि यह काम नहीं करता है, तो कम से कम दुर्भावनापूर्ण साइट को अंतहीन पाश से अवरुद्ध करें। लेकिन ईमानदार होने के लिए, मुझे कुछ और पढ़ने फिर से करने की जरूरत है। लेकिन मुझे लगता है कि कोड या फेंक अपवाद के रूप में पार्स किया जा सकता है सब कुछ बुरा हो सकता है। –

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