2009-04-18 11 views
17

मैं जैसे वाक्यांशों में शब्द "से बचने" और "एन्कोडिंग" के बीच अंतर के लिए के रूप में उलझन में हूँ:Xml से बचने के लिए/एन्कोडिंग शब्दावली

Xml एन्कोडिंग

Xml से बचने के लिए

एन्कोडेड एचटीएमएल

यूआरएल

...

बच सकते हैं किसी ने मुझे यह समझाया?

उत्तर

24

Encoding वर्णन करता है कि फ़ाइल के वर्ण बाइनरी में शारीरिक रूप से लिखे गए हैं (जैसे यूनिकोड या एएनएसआई में)।

Escaping साथ (जैसे < और > के रूप में) विशेष वर्ण की जगह की प्रक्रिया को दर्शाता उनके XML entity बराबर (जैसे &lt; और &gt; के रूप में)। यूआरएल के लिए, एस्केपिंग का मतलब है कि % से शुरू होने वाले तारों वाले वर्णों को प्रतिस्थापित करना, जैसे %20 एक ही व्हाइटस्पेस के लिए।

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

+3

एक pedantic स्पष्टीकरण: "यूनिकोड" एक एन्कोडिंग नहीं है लेकिन एक चरित्र सेट (यूटीएफ -8, आईएसओ 8859-1, सीपी 850 एन्कोडिंग के उदाहरण हैं)। अफसोस की बात है, यूनिकोड और यूटीएफ -8 अक्सर समानार्थी के रूप में उपयोग किए जाते हैं जबकि वे नहीं होते हैं। – tokland

+0

सहमत है कि "एन्कोडिंग" सही शब्द w/r/t "वर्ण एन्कोडिंग" है, लेकिन विशेष शब्दों से बचने के लिए वर्णों को बदलने की प्रक्रिया की बात आने पर ये शर्तें "अच्छी तरह परिभाषित और विशिष्ट" नहीं हैं। मेरा जवाब देखें –

+0

यरोन ने क्या पूछा है, इसके बारे में ध्यान दें।नेट फ्रेमवर्क में आपके पास इन दो विधियां हैं, जो लगभग एक ही चीज़ करती हैं: 'HttpUtility.UrlPathEncode' और' Uri.EscapeUriString'। – Andrew

6

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

अब, मूल रूप से, प्रत्येक परत को एक-दूसरे से "बात" करने की ज़रूरत होती है, और उन्हें एक ऐसी भाषा पर निर्णय लेना पड़ता है जिसके माध्यम से वे बात कर सकते हैं। इसे एन्कोडिंग कहा जाता है। एएससीआईआई, यूटीएफ -8, यूटीएफ -16, आदि जैसे विभिन्न प्रकार के एन्कोडिंग मौजूद हैं उदाहरण के लिए, यदि उपयोगकर्ता चीनी या जापानी है, तो उसके लिए एएससीआईआई काम नहीं करेगा, इसलिए वह यूटीएफ -16 के साथ आगे बढ़ेगा या कोई अन्य एन्कोडिंग तकनीक जो चीनी में संचार की गारंटी देगी। तो वेब परत से, चीनी वर्ण व्यापार परत से गुज़रेंगे, और उसके बाद डेटा परत, और हर जगह, एक ही "एन्कोडिंग" योजना का उपयोग किया जाना है।

क्यों?

अब मान लीजिए, आपका वेब लेयर, यूटीएफ -16 में डेटा भेजता है, चीनी भाषा का समर्थन करता है, लेकिन डेटाबेस परत स्वीकार करता है, केवल ASCII, तो डेटाबेस परत आप क्या बात कर रहे हैं के रूप में भ्रमित हो जाएगी! यह केवल अंग्रेजी पात्रों को समझता है, यह बाकी को समझ नहीं पाएगा। यह एन्कोडिंग के बारे में था।

से बचने के लिए:

वहाँ "मेटाडेटा" कहा जाता है डेटा जो ब्राउज़रों के नजरिए से एक विशेष अर्थ नहीं होता की एक निश्चित सेट है। उदाहरण के लिए, <> ब्राउज़र परिप्रेक्ष्य से मेटाडेटा हैं। ब्राउज़र पार्सर जानता है कि इन <> के अंदर मौजूद सभी डेटा का व्याख्या किया जाना है। अब हमलावर ब्राउज़र को भ्रमित करने के लिए इस तकनीक का उपयोग करते हैं। उदाहरण के लिए:

<input type="text" value="${name} /> 

अगर मैं

name="/><script>alert(document.cookie)</script> 

तो उसके एवज में कोड ब्राउज़र देखता है के रूप में के साथ नाम की जगह यह हो जाएगा

<input type="text" value=""/><script>alert(document.cookie)</script> /> 

मतलब, अब आप को निर्देश देने की जरूरत है ब्राउजर जो मैंने name="" में डाला है उसे "बच निकला" होना चाहिए, या केवल डेटा के रूप में माना जाना चाहिए। तो ऐसे कई कार्य हैं जो या तो <> को अपने एचटीएमएल समतुल्य %3C%3E के रूप में एन्कोड/भागते हैं, इसलिए अब ब्राउज़र जानता है कि इसे अलग-अलग इलाज किया जाना चाहिए। असल में बचने का अर्थ उनके वास्तविक अर्थ से बचने के लिए है (मोटे तौर पर बोलते हुए)।

<input type="text" value="${fn:escapeXML(name)} /> 

जेएसटीएल का उपयोग कर।

0

टीएल; डीआर दोनों शर्तें अदला-बदले (यदि आपका मतलब है कि कुछ वर्णों को परिवर्तित करना है तो उन्हें सादा स्ट्रिंग डेटा के रूप में व्याख्या किया जाएगा)। यह बहस पुरानी है। CWE-116: Improper Encoding or Escaping of Output से:

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

मजाकिया पर्याप्त जावास्क्रिप्ट भी encodeURIComponent() है, और अपनी specification पूरी तरह बहस से बचा जाता है:

encodeURIComponent समारोह में URI का एक नया संस्करण जो कुछ वर्णों की प्रत्येक आवृत्ति की जगह की गणना करता है एक, दो, तीन, या चार भागने अनुक्रम चरित्र के यूटीएफ -8 एन्कोडिंग का प्रतिनिधित्व करते हैं।

निजी तौर पर मेरा मानना ​​है कि यह "एन्कोडिंग" सामान्य प्रक्रिया का उल्लेख करने के लिए अधिक उपयुक्त है, जैसा कि आप एक code बना रहे हैं एक संचार चैनल (मार्कअप/प्रोग्रामिंग कोड का एक टुकड़ा) के माध्यम से प्रेषित और व्याख्या की जा करने के लिए एक से रिसीवर (पार्सर)। मुझे लगता है कि < को &#60; जैसी पूरी तरह से अलग करने के साथ मूर्खतापूर्ण है और "भागने" को कॉल करें।

+0

उदाहरण के लिए, .NET ढांचे में आपके पास इन दो विधियां हैं, जो लगभग एक ही चीज़ करती हैं: 'HttpUtility.UrlPathEncode' और' Uri.EscapeUriString'। – Andrew