2012-02-16 5 views
79

मैं इस तरह डोम में मनमाने ढंग से JSON एम्बेड करने के बारे में सोच रहा हूँ:डोम में मनमानी JSON एम्बेड करने के लिए सबसे अच्छा अभ्यास?

<script type="application/json" id="stuff"> 
    { 
     "unicorns": "awesome", 
     "abc": [1, 2, 3] 
    } 
</script> 

इस तरह एक एक JavaScript टेम्प्लेट इंजन के साथ बाद में उपयोग के लिए डोम में एक मनमाना HTML टेम्पलेट संग्रहीत कर सकता है के समान है। इस मामले में, हम बाद में JSON पुनः प्राप्त कर सकते हैं और साथ उसे पार्स:

var stuff = JSON.parse(document.getElementById('stuff').innerHTML); 

This works, लेकिन यह सबसे अच्छा तरीका है? क्या यह किसी भी सर्वोत्तम अभ्यास या मानक का उल्लंघन करता है?

नोट: मैं डीओएम में जेएसओएन को संग्रहीत करने के विकल्पों की तलाश नहीं कर रहा हूं, मैंने पहले ही तय कर लिया है कि मेरे पास होने वाली विशेष समस्या का सबसे अच्छा समाधान है। मैं बस इसे करने का सबसे अच्छा तरीका ढूंढ रहा हूं।

+1

कारण है कि आप जावास्क्रिप्ट में एक 'var' के रूप में यह नहीं होगा – Krizz

+0

@Krizz, यह है कि यह बाद में एक जटिल द्वारा संसाधित किया जाता है एक स्थिर दस्तावेज़ का हिस्सा होने की जरूरत है? encapsulated जावास्क्रिप्ट की श्रृंखला। इसे डोम में संग्रहीत करना है जो मैं करना चाहता हूं। –

+0

@ Krizz मुझे इसी तरह की समस्या से उत्पन्न किया गया था। मैं AJAX अनुरोध किए बिना प्रत्येक उपयोगकर्ता के लिए अलग-अलग साइट पर डेटा रखना चाहता था। तो मैंने एक कंटेनर में कुछ PHP एम्बेडेड किया जो आपके पास जावास्क्रिप्ट में डेटा प्राप्त करने के लिए ऊपर जैसा कुछ था। –

उत्तर

61

मुझे लगता है कि आपकी मूल विधि सर्वोत्तम है। एचटीएमएल 5 कल्पना भी पते इस प्रयोग:

"जब (लिपियों के विपरीत) डेटा ब्लॉक शामिल करने के लिए प्रयोग किया जाता है, डेटा सन्निहित होना चाहिए इनलाइन, डाटा का स्वरूप प्रकार विशेषता का उपयोग कर दिया जाना चाहिए, src विशेषता निर्दिष्ट नहीं की जानी चाहिए, और स्क्रिप्ट तत्व की सामग्री को प्रारूपित प्रारूप के लिए परिभाषित आवश्यकताओं के अनुरूप होना चाहिए। "

यहां पढ़ें: http://dev.w3.org/html5/spec/Overview.html#the-script-element

आप वास्तव में किया है। कौन सी चीज़ क्या प्यार करने के लिए नहीं है? गुण डेटा के साथ आवश्यक कोई वर्ण एन्कोडिंग नहीं। यदि आप चाहें तो इसे प्रारूपित कर सकते हैं। यह अभिव्यक्तिपूर्ण है और इच्छित उपयोग स्पष्ट है। यह एक हैक की तरह महसूस नहीं करता है (उदाहरण के लिए अपने "वाहक" तत्व को छिपाने के लिए सीएसएस का उपयोग करना)। यह पूरी तरह से मान्य है।

+2

धन्यवाद। कल्पना से उद्धरण ने मुझे विश्वास दिलाया है। –

+15

यह केवल तभी मान्य है जब आप JSON ऑब्जेक्ट को पहले जांच और sanitize: आप केवल उपयोगकर्ता मूल डेटा एम्बेड नहीं कर सकते हैं। प्रश्न पर मेरी टिप्पणी देखें। – silviot

+1

अतिरिक्त सोच: इसे रखने के लिए अच्छी जगह क्या है? सिर या शरीर, ऊपर या नीचे? – challet

18

एक सामान्य दिशा के रूप में, मैं इसके बजाय HTML5 data attributes का उपयोग करने का प्रयास करूंगा। आपको वैध JSON डालने से रोकने के लिए कुछ भी नहीं है। उदाहरण के लिए:

<div id="mydiv" data-unicorns='{"unicorns":"awesome", "abc":[1,2,3]}' class="hidden"></div> 

आप jQuery का उपयोग कर रहे हैं, तो पुन: प्राप्त करने के रूप में आसान है:

var stuff = JSON.parse($('#mydiv').attr('data-unicorns')); 
+1

समझ में आता है। हालांकि ध्यान दें कि कुंजी नाम के लिए सिंगल कोट्स के साथ, 'JSON.parse' काम नहीं करेगा (कम से कम मूल Google क्रोम JSON.parse नहीं होगा)। जेएसओएन स्पेक को डबल कोट्स की आवश्यकता होती है। लेकिन यह ... < यूनिकॉर्न्स > जैसे इकाइयों का उपयोग करने के लिए पर्याप्त आसान है: ... '। –

+4

हालांकि एक प्रश्न: क्या एचटीएमएल 5 में विशेषताओं की लंबाई की कोई सीमा है? –

+0

हाँ, यह काम करेगा। आप इसे चारों ओर भी स्विच कर सकते हैं ताकि आपका एचटीएमएल एकल कोट्स का उपयोग कर सके और JSON डेटा डबल का उपयोग करता है। –

5

मैं एक समारोह कॉलबैक (JSONP के प्रकार के साथ एक इनलाइन स्क्रिप्ट में JSON डाल करने के लिए सुझाव देंगे):

<script> 
someCallback({ 
    "unicorns": "awesome", 
    "abc": [1, 2, 3] 
}); 
</script> 

क्रियान्वित स्क्रिप्ट दस्तावेज़ के बाद लोड किया जाता है, तो आप एक अतिरिक्त पहचानकर्ता तर्क के साथ संभवतः इस कहीं स्टोर कर सकते हैं,: someCallback("stuff", { ... });

+0

सुझाव के लिए धन्यवाद, लेकिन यह वास्तव में मेरे उद्देश्यों के लिए काम नहीं करता है। –

+0

@ बेनली इसे कॉलबैक फ़ंक्शन को परिभाषित करने के एकमात्र नुकसान के साथ बहुत अच्छी तरह से काम करना चाहिए। अन्य सुझाए गए समाधान विशेष HTML वर्णों (उदाहरण के लिए) और उद्धरणों पर तोड़ते हैं, यदि आपके पास आपके JSON में हैं। – copy

+0

यह बेहतर लगता है क्योंकि आपको डेटा – Jaseem

2

मेरी सिफारिश जेएसओएन डेटा को बाहरी .json फ़ाइलों में रखना होगा, और फिर उन फ़ाइलों को अजाक्स के माध्यम से पुनर्प्राप्त करना होगा। आप वेब पेज (इनलाइन) पर सीएसएस और जावास्क्रिप्ट कोड नहीं डालते हैं, तो आप JSON के साथ ऐसा क्यों करेंगे?

+9

आप वेब पेज में सीएसएस और जावास्क्रिप्ट इनलाइन नहीं डालते क्योंकि यह आमतौर पर अन्य पृष्ठों के बीच साझा किया जाता है। यदि इस संदर्भ के लिए स्पष्ट रूप से सर्वर द्वारा प्रश्न में डेटा उत्पन्न होता है, तो एम्बेडिंग यह किसी ऐसे चीज़ के लिए एक और अनुरोध शुरू करने से कहीं अधिक कुशल है जिसे कैश नहीं किया जा सकता है। –

+0

ऐसा इसलिए है क्योंकि मैं एक विरासत प्रणाली को अद्यतन कर रहा हूं जिसे खराब तरीके से डिजाइन किया गया था, और पूरे सिस्टम को फिर से डिजाइन करने के बजाय, मुझे केवल एक भाग को ठीक करने की आवश्यकता है। डीओएम में JSON को संग्रहीत करना इस भाग को ठीक करने का सबसे अच्छा तरीका है। इसके अलावा, मैं सहमत हूं कि @ jamietre ने क्या कहा। –

+0

@jamietre ध्यान दें कि ओपी ने कहा है कि यह JSON स्ट्रिंग केवल * बाद * की आवश्यकता है। सवाल यह है कि अगर इसकी हमेशा आवश्यकता होती है, या केवल कुछ मामलों में। अगर इसे केवल कुछ मामलों में जरूरी है, तो इसे बाहरी फाइल में रखना और इसे सशर्त रूप से लोड करना समझ में आता है। –

10

एक स्क्रिप्ट टैग में जेसन एम्बेड करने की यह विधि एक संभावित सुरक्षा समस्या है। उपयोगकर्ता इनपुट से उत्पन्न जेसन डेटा मानते हुए, डेटा सदस्य को तैयार करना संभव है जो प्रभावी रूप से स्क्रिप्ट टैग से बाहर हो जाएगा और डोम में प्रत्यक्ष इंजेक्शन की अनुमति देगा।यहाँ देखें:

http://jsfiddle.net/YmhZv/1/

यहाँ इंजेक्शन

<script type="application/json" id="stuff"> 
{ 
    "unicorns": "awesome", 
    "abc": [1, 2, 3], 
    "badentry": "blah </script><div id='baddiv'>I should not exist.</div><script type="application/json" id='stuff'> ", 
} 
</script> 

बस कोई चारों ओर जिस तरह से बचने/एन्कोडिंग नहीं है है।

+5

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

+0

JSON HTML का हिस्सा नहीं है, HTML पार्सर बस चल रहा है। यह वही है जब JSON एक पाठ अनुच्छेद या div-element का हिस्सा होगा। एचटीएमएल- अपने कार्यक्रम में सामग्री से बचें। इसके अलावा, आप भी स्लेश से बच सकते हैं। जबकि JSON को इसकी आवश्यकता नहीं है, यह अनियंत्रित स्लेश को सहन करता है। इसे एम्बेड करने के लिए इसे सुरक्षित बनाने के उद्देश्य से उसका उपयोग किया जा सकता है। PHP का json_encode डिफ़ॉल्ट रूप से ऐसा करता है। – Krinkle

0

ओडब्ल्यूएएसपी की एक्सएसएस रोकथाम धोखा शीट में Rule #3.1 देखें।

{ 
    "html": "<script>alert(\"XSS!\");</script>" 
} 

एक छिपा <div> HTML में बनाएँ:

आप HTML में इस JSON शामिल करने के लिए चाहते हैं। इसके बाद, असुरक्षित संस्थाओं एन्कोडिंग करके अपने JSON से बचने के (जैसे, &, <,>, ", ', और, /) और तत्व के अंदर डाल दिया।

<div id="init_data" style="display:none"> 
     {&#34;html&#34;:&#34;&lt;script&gt;alert(\&#34;XSS!\&#34;);&lt;/script&gt;&#34;} 
</div> 

अब आप textContent के पढ़ने तक पहुँच सकते हैं तत्व जावास्क्रिप्ट का उपयोग और यह पार्स करने:

var text = document.querySelector('#init_data').textContent; 
var json = JSON.parse(text); 
console.log(json); // {html: "<script>alert("XSS!");</script>"} 
संबंधित मुद्दे