2010-11-14 15 views
19

संपादित करें: भविष्य में संदर्भ के लिए, मैं गैर एक्सएचटीएमएल सामग्री प्रकार परिभाषा <!html>एम्बेडिंग JSON स्क्रिप्ट टैग में वस्तुओं

मैं Django का उपयोग कर एक वेबसाइट का निर्माण कर रहा हूँ उपयोग कर रहा हूँ, और मैं में मनमाने ढंग से json डेटा एम्बेड करने के लिए कोशिश कर रहा हूँ मेरे पृष्ठों का उपयोग क्लाइंट-साइड जावास्क्रिप्ट कोड द्वारा किया जाना चाहिए।

मान लें कि मेरी जेसन ऑब्जेक्ट {"foo": "</script>"} है। अगर मैं इसे सीधे एम्बेड करता हूं,

<script type='text/javascript'>JSON={"foo": "</script>"};</script> 

पहला जेसन ऑब्जेक्ट बंद करता है। (यह भी, यह साइट को एक्सएसएस के लिए कमजोर बना देगा, क्योंकि यह जेसन ऑब्जेक्ट गतिशील रूप से जेनरेट किया जाएगा)।

अगर मैं Django के एचटीएमएल भागने फ़ंक्शन का उपयोग करें, जिसके परिणामस्वरूप उत्पादन होता है:

<script type='text/javascript'>JSON={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 

और ब्राउज़र <script> टैग की व्याख्या नहीं कर सकते हैं।

सवाल मैं यहाँ है,

  1. कौन सा वर्ण हूँ मैं इस स्थिति में बच नहीं/से बचने के लिए लगता है?
  2. क्या Python/django में इसे करने का स्वचालित तरीका है?
+0

आप केवल

6

मैं फ़ॉरवर्ड स्लैश बचने बैकस्लैश करने की कोशिश की और कहा कि काम करने के लिए लगता है:

<script type='text/javascript'>JSON={"foo": "<\/script>"};</script> 

आपको लगता है कि कोशिश की है?


एक तरफ ध्यान दें पर, मैं हैरान हूँ कि एक स्ट्रिंग में एम्बेडेड </script> टैग जावास्क्रिप्ट टूट जाता हूँ। पहले इसे विश्वास नहीं कर सका लेकिन क्रोम और फ़ायरफ़ॉक्स में परीक्षण किया गया।

+1

एम्बेडेड तोड़ने की अपेक्षा की जाती है (मैंने सोचा कि यह भी अजीब था), क्योंकि इसका मतलब है कि जेएस पार्सिंग को HTML पार्सिंग के साथ किया जाना चाहिए (एचटीएमएल पार्सर जावास्क्रिप्ट टेक्स्ट के अर्थशास्त्र से अवगत होना चाहिए), जो मेरे लिए बहुत जटिल लगता है। –

+1

हाँ, एक नियम के रूप में एचटीएमएल पार्सर्स जावास्क्रिप्ट नहीं बोलते हैं। एचटीएमएल को पार्स किए जाने के बाद ही स्क्रिप्ट टैग की सामग्री दुभाषिया को पास की जाती है, और HTML टैग्स के बारे में कुछ भी नहीं कहता है जब टैग उद्धरण चिह्नों के बीच होते हैं! –

+1

हां, इसकी अपेक्षा की जाती है - इसे रोकने के लिए सामान्य चाल दो टैग में टूट जाती है - '" "' –

0

साथ \u003c और --> साथ < को बदलने के लिए मैं कुछ इस तरह करना होगा है:

<script type='text/javascript'>JSON={"foo": "</" + "script>"};</script> 
0

अजगर में इस मामले के लिए, मैं बग ट्रैकर में एक bug खोला है। हालांकि नियम वास्तव में जटिल हैं, <!-- और <script> अपनाए गए एचटीएमएल 5 पार्सिंग नियमों में भी कई बुरे तरीकों से एक साथ खेलते हैं। बीटीडब्लू, ">" एक मान्य JSON भागने वाला नहीं है, इसलिए इसे बेहतर ढंग से "\ u003E" के साथ प्रतिस्थापित किया जाएगा, इस प्रकार पूरी तरह से सुरक्षित भागने से बचने के लिए \ u003C और \ u003E और अजगर बग में उल्लिखित कुछ अन्य बुरा वर्ण वर्णित होना चाहिए। ..

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