2009-12-15 12 views
7

एचटीएमएल आउटपुट करते समय, कई अलग-अलग जगहें हैं जहां पाठ को अक्षर अक्षर के बजाय नियंत्रण वर्णों के रूप में व्याख्या किया जा सकता है। उदाहरण के लिए, "नियमित" पाठ में (जो किसी भी तत्व मार्कअप के बाहर है):सभी एचटीएमएल से बचने वाले संदर्भ क्या हैं?

<div>This is regular text</div> 
साथ ही

विशेषताओं के मान के भीतर:

<input value="this is value text"> 

और, मुझे विश्वास है, एचटीएमएल टिप्पणियों के भीतर:

<!-- This text here might be programmatically generated 
and could, in theory, contain the double-hyphen character 
sequence, which is verboten inside comments --> 

पाठ के इन तीन प्रकार से प्रत्येक यह कैसे बच गए किया जाना चाहिए क्रम गैर मार्कअप के रूप में इलाज किया जा करने के लिए के लिए अलग नियम हैं। तो मेरा पहला सवाल है, क्या HTML में कोई अन्य संदर्भ हैं जिसमें वर्णों को मार्कअप/नियंत्रण वर्णों के रूप में व्याख्या किया जा सकता है? उपर्युक्त संदर्भों में स्पष्ट रूप से अलग-अलग नियम हैं जिनसे बचने की आवश्यकता है।

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

टेंगेंशियल: निम्न पाठ त्रुटियों को फेंक देगा HTML 4.01 स्ट्रिक्ट के रूप में:

<a href="http://example.com/file.php?x=1&y=2">foo</a> 

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

+0

पढ़ सकते हैं संयोग से, मुझे पता नहीं है कि कोई भी के लिए "अनुक्रम पलायन" - एक HTML टिप्पणी के अंदर; वे केवल निषिद्ध हैं (क्योंकि टिप्पणियों को पार्सर द्वारा अनदेखा किया जाता है और प्रस्तुत नहीं किया जाता है, इसलिए एक भागने का अनुक्रम कोई उद्देश्य नहीं देगा)। अगर किसी कारण से आपको एक टिप्पणी शामिल करने की आवश्यकता है जिसमें शामिल है -, आपको या तो इसे कम करने या इसे कम आक्रामक (उदाहरण के लिए यू + 2014 ईएम DASH) के साथ प्रतिस्थापित करने की आवश्यकता होगी। – dirtside

+0

तो बस अपना प्रश्न क्या है। – Kieran

उत्तर

11
<div>This is regular text</div> 
पाठ सामग्री

: & भाग निकले किया जाना चाहिए। < बच जाना चाहिए।

तो एक गैर- UTF एन्कोडिंग में एक दस्तावेज के उत्पादन, अक्षर है कि चुने हुए एन्कोडिंग के अंदर फिट नहीं है भाग निकले किया जाना चाहिए।

एक्सएचटीएमएल में (और सामान्य में एक्सएमएल), अनुक्रम ]]>, पाठ्य सामग्री में नहीं आना चाहिए ताकि विशिष्ट मामले में उस क्रम में पात्रों में से एक, भाग निकले जाना चाहिए पारंपरिक रूप से >। स्थिरता के लिए, विहित XML विवरण > पाठ्य सामग्री में हर बार है, जो एक से बचने के समारोह के लिए एक बुरी रणनीति नहीं है से बचने के लिए, लेकिन आप निश्चित रूप से हाथ-लेखन के लिए छोड़ सकते हैं चुनता है।

<input value="this is value text"> 

विशेषता मान: & बच जाना चाहिए। विशेषता मान delimiter " या ' से बच जाना चाहिए। यदि कोई विशेषता मान डिलीमीटर का उपयोग नहीं किया जाता है (ऐसा न करें) कोई बचाना संभव नहीं है।

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

एक्सएचटीएमएल < में भाग जाना चाहिए। जबकि आप HTML4 में भागने से दूर हो सकते हैं, यह एक अच्छा विचार नहीं है।

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

दोनों पाठ्य सामग्री और विशेषता के लिए मान: XML 1.1 के तहत XHTML में, यदि आप प्रतिबंधित वर्ण, जो हटाएं चरित्र और C0 और C1 नियंत्रण कोड, शून्य से टैब, सीआर, वामो और नेल हैं पलायन करना होगा। कुल मिलाकर, [\x01-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]। एक्सएमएल 1.1 में भी बचने वाले शून्य चरित्र को शामिल नहीं किया जा सकता है। एक्सएमएल 1.1 के बाहर आप इन पात्रों में से किसी भी का उपयोग नहीं कर सकते हैं, न ही कोई अच्छा कारण है जिसे आप कभी चाहना चाहते हैं।

<!-- This text here might be programmatically generated 
and could, in theory, contain the double-hyphen character 
sequence, which is verboten inside comments --> 

हाँ, पर जब से संभव अंदर टिप्पणियों से बचने नहीं, वहाँ कुछ भी नहीं आप इसके बारे में क्या कर सकते हैं नहीं है। यदि आप <!-- &lt; --> लिखते हैं, तो इसका शाब्दिक अर्थ है "एम्पर्सेंड-लेटर एल-लेटर टी-अर्धविराम" जिसमें एक टिप्पणी या डीओएम या अन्य इंफोसेट में दिखाई देगा। -- वाली एक टिप्पणी को बस क्रमबद्ध नहीं किया जा सकता है।

<![CDATA[ अनुभाग और <?pi एस एक्सएमएल में भी भागने का उपयोग नहीं कर सकते हैं। ]]> अनुक्रम सहित सीडीएटीए अनुभाग को क्रमबद्ध करने का पारंपरिक समाधान दो सीडीएटीए अनुभागों पर उस अनुक्रम को विभाजित करना है, इसलिए यह एक साथ नहीं होता है। आप इसे एक सीडीएटीए अनुभाग में क्रमबद्ध नहीं कर सकते हैं, और आप डेटा में ?> के साथ पीआई को क्रमबद्ध नहीं कर सकते हैं।

<script> और <style> एचटीएमएल (नहीं एक्सएचटीएमएल) में की तरह CDATA-तत्वों </ (ETAGO) अनुक्रम शामिल नहीं हो सकता के रूप में इस तत्व की शुरुआत और फिर त्रुटि खत्म होगा अगर एंड-टैग-नाम और उसके बाद नहीं। चूंकि सीडीएटीए-तत्वों के भीतर कोई भागना संभव नहीं है, इसलिए इस अनुक्रम से बचा जाना चाहिए और आसपास काम किया जाना चाहिए (उदाहरण के लिए document.write('</p>')document.write('<\/p>'); में बदलकर। (आप इस बारे में बहुत जटिल जटिल रणनीतियां देखते हैं, जैसे कि unescape को जेएस- % -encoded स्ट्रिंग;। यहां तक ​​कि अक्सर '</scr'+'ipt>' जो अभी भी काफी अमान्य है)

वहाँ HTML और XML में एक और संदर्भ में, जहां अलग नियम लागू होते हैं, और कहा कि (DOCTYPE घोषणा में आंतरिक सबसेट सहित, यदि आप DTD में है एक है), जहां % चरित्र में विशेष शक्तियां हैं और उन्हें शाब्दिक रूप से उपयोग करने के लिए भागने की आवश्यकता होगी। लेकिन एक HTML दस्तावेज़ लेखक के रूप में यह बेहद असंभव है कि आपको कभी भी पूरी गड़बड़ी के पास कहीं भी जाना होगा।

The following text will throw errors as HTML 4.01 Strict: 

<a href="http://example.com/file.php?x=1&y=2">foo</a> 

हां, और यह संक्रमणकालीन में उतनी ही त्रुटि है।

If you put a space after the &, however, it validates just fine. 

हाँ, SGML के तहत कुछ भी लेकिन [A-Za-z] और # एक संदर्भ के रूप पार्स करने शुरू नहीं करता है नियम। हालांकि इस पर भरोसा करना अच्छा विचार नहीं है। (बेशक, यह एक्सएचटीएमएल में अच्छी तरह से गठित नहीं है।)

+0

धन्यवाद। असल में एक्सएमएल के बारे में चिंतित नहीं था, सिर्फ एचटीएमएल, लेकिन आपने सत्यापित किया कि मैंने पहले ही क्या मामला माना था। – dirtside

1

उपर्युक्त संदर्भों में स्पष्ट रूप से अलग-अलग नियम हैं जिनसे बचने की आवश्यकता है।

मुझे यकीन है कि विभिन्न तत्वों अलग एन्कोडिंग नियम है कि आप की तरह यह नहीं कह रहा हूँ। आपके द्वारा सूचीबद्ध सभी उदाहरणों को HTML एन्कोडिंग की आवश्यकता होती है।

उदा।

<h1>Fish &amp; Chips</h1> 
<img alt="Awesome picture of Meat Pie &amp; Chips" /> 
<a href="products.aspx?type=1&amp;meal=fish%20%26%20chips&amp;page=1">Fish &amp; Chips</a> 

पिछले उदाहरण एम्परसेंड भी (&) और उसके इस बिंदु पर बातें बालों मिल (डेटा के रूप में एक ampersand भेजने, जिसके कारण यह एन्कोड किया जाना चाहिए) के लिए कुछ यूआरएल एन्कोडिंग भी शामिल है।

तो मेरा पहला सवाल है, क्या HTML में कोई अन्य संदर्भ हैं जिसमें वर्णों को मार्कअप/नियंत्रण वर्णों के रूप में व्याख्या किया जा सकता है?

HTML दस्तावेज़ के भीतर कहीं भी, यदि नियंत्रण वर्ण नियंत्रण वर्णों के रूप में उपयोग नहीं किए जा रहे हैं, तो आपको उन्हें एन्कोड करना चाहिए (अंगूठे का एक अच्छा नियम के रूप में)। अधिकांश समय, उसके HTML एन्कोडिंग, & या > आदि Othertimes, जब किसी URL, उपयोग यूआरएल एन्कोडिंग% 20,% 26 आदि के माध्यम से इन पात्रों पारित करने के लिए कोशिश कर रहा

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

मैं कहना चाहता हूँ कि Wikipedia article उस पर कुछ अच्छे टिप्पणी की है और पढ़ने लायक हो सकता है - यह भी W3 Schools article मुझे लगता है कि एक अच्छा स्थान है। अधिकतर भाषाओं ने टेक्स्ट को सुरक्षित HTML के रूप में तैयार करने के लिए फ़ंक्शंस में बनाया है, इसलिए आपकी पसंद की भाषा की जांच करने के लायक हो सकते हैं (यदि आप वास्तव में किसी भी स्क्रिप्टिंग भाषाओं का उपयोग कर रहे हैं और HTML को कोडिंग नहीं करते हैं)।

विशेष रूप से, विकिपीडिया कहता है: "वर्ण <,>," और & टैग, विशेषता मान, और चरित्र संदर्भों को सीमित करने के लिए उपयोग किया जाता है। चरित्र एंटिटी संदर्भ & lt ;, & gt ;, & quot; और & amp ;, जो HTML, XML, और SGML में पूर्वनिर्धारित कर रहे हैं, वर्ण का शाब्दिक अभ्यावेदन के लिए बजाय प्रयोग किया जा सकता है। "

यूआरएल एन्कोडिंग के लिए, this article seems a good starting point

समापन विचार के रूप में मैं पहले से ही rambled है एक सा: यह सभी XML/XHTML के विचार जो अदालत और उसके आवश्यकता है कि काफी दुनिया और उसके कुत्ते एनकोड करने की आवश्यकता करने के लिए एक पूरी अन्य बॉलगेम लाता है को छोड़कर आप एक पटकथा भाषा का उपयोग कर और एक चर बाहर लिख रहे हैं। इसके माध्यम से, मुझे पूरा यकीन है कि निर्मित फ़ंक्शन को ढूंढना आसान होगा, या एक लाइब्रेरी डाउनलोड करें जो आपके लिए यह करेगी। :) मुझे उम्मीद है कि यह उत्तर ठीक से स्कॉप्ड किया गया था और बिंदु या प्रश्न को याद नहीं किया या गलत स्वर में आते हैं। :)

+0

उनके पास अलग-अलग भागने वाले नियम हैं; आपको एक विशेषता मूल्य के अंदर <से बचने की आवश्यकता नहीं है क्योंकि उस संदर्भ में इसकी कोई नियंत्रण कार्यक्षमता नहीं है, लेकिन आपको इसे नियमित पाठ में भागने की आवश्यकता है क्योंकि <<में नियंत्रण कार्यक्षमता है। इसके विपरीत, नियमित पाठ में, "और 'की कोई नियंत्रण कार्यक्षमता नहीं है, लेकिन वे एक विशेषता मान के अंदर करते हैं। अब, यह नियमित पाठ में' और" से बचने के लिए HURT नहीं है, लेकिन यह अनावश्यक है। तो शायद एचटीएमएल में किसी भी संदर्भ में हर नियंत्रण चरित्र की एक सूची स्थापित करना सबसे अच्छा होगा, और हमेशा उन सभी से बचें। – dirtside

+0

सहमत हुए। मैं बस अनुमान लगाता हूं कि मैं गलती की संभावनाओं को कम करने के दौरान हर समय एन्कोड करता हूं। :) – Amadiere

0

आप अंतिम HTML की वैधता के बारे में इस चिंतित हैं, तो आप एक डोम के माध्यम से एचटीएमएल निर्माण, बनाम पाठ के रूप में सोच सकते हैं।

आप कहते हैं कि क्या पर्यावरण आप लक्षित कर रहे।

+0

मैं अभ्यास के साथ केवल सिद्धांत के साथ चिंतित नहीं हूं। विभिन्न वेब ब्राउज़रों का व्यवहार * एक तरफ *, सैद्धांतिक रूप से भागने के लिए सबसे अच्छा अभ्यास क्या है? – dirtside

+0

या इसके बजाय, सर्वोत्तम * सिद्धांत * ;-) – dirtside

1

यदि आप वेब ब्राउज़र (एचटीएमएल, जावास्क्रिप्ट और स्टाइल शीट समेत) में वर्णों से बचने के लिए सर्वोत्तम प्रथाओं की तलाश में हैं, तो माइकल कोटेस द्वारा एक्सएसएस रोकथाम धोखा शीट शायद आप जो खोज रहे हैं। इसमें विभिन्न व्याख्या संदर्भों का वर्णन शामिल है, तालिकाएं दर्शाती हैं कि प्रत्येक संदर्भ और कोड नमूने में वर्णों को एन्कोड कैसे करें (ESAPI का उपयोग करके)।

http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

0

सावधान रहें कि <script><!--<script> फिर से के बाद के बाद, में प्रवेश करती है डबल भाग निकले राज्य है, जिसमें आप शायद कभी इतना आदर्श आप "\ u003C" अपनी स्क्रिप्ट का तार के भीतर के साथ < बच चाहिए होना चाहता हूँ, (और regexps) इसे गलती से ट्रिगर नहीं करने के लिए।

आप इसके बारे में अधिक यहाँ http://qbolec-memdump.blogspot.com/2013/11/script-tag-content-madness.html

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