2009-04-23 8 views
17

कभी-कभी, सर्वर पक्ष इनलाइन जावास्क्रिप्ट कोड में एम्बेडेड स्ट्रिंग उत्पन्न करेगा। उदाहरण के लिए, यदि "उपयोगकर्ता नाम" एएसपी.NET द्वारा उत्पन्न किया जाना चाहिए। फिर ऐसा लगता है।क्या जावास्क्रिप्ट स्ट्रिंग के लिए "<" and ">" वर्ण से "भागना" आवश्यक है?

<script> 
    var username = "<%UserName%>"; 
</script> 

यह एक उपयोगकर्ता उसकी/उसके नाम होने की

</script><script>alert('bug')</script></script>

यह XSS जोखिम है हो सकता है क्योंकि, सुरक्षित नहीं है।

तो, मूल रूप से, कोड होना चाहिए:

<script> 
    var username = "<% JavascriptEncode(UserName)%>"; 
</script> 

क्या JavascriptEncode करता charater जोड़ने के लिए है "\" से पहले "/" और " '" और "" तो, उत्पादन html "। की तरह है वर उपयोगकर्ता नाम = "</script> चेतावनी (\ 'बग \') </script> </script>";।

ब्राउज़र की व्याख्या नहीं होगा "+०१२३८७०३९५४/स्क्रिप्ट> "स्क्रिप्ट ब्लॉक के अंत के रूप में। तो, XSS से बचने में।

हालांकि, अभी भी "<" और ">" हैं। इन दो पात्रों से बचने के लिए भी सुझाव दिया जाता है। सबसे पहले, मुझे विश्वास नहीं है कि "<" को "& लेफ्टिनेंट" में बदलना एक अच्छा विचार है। और ">" से "& gt;" यहाँ। और, मुझे यकीन नहीं है कि "<" को "\ <" और ">" से "\>" में बदलना सभी ब्राउज़रों के लिए पहचान योग्य है। ऐसा लगता है कि "<" और ">" के लिए आगे एन्कोडिंग करना आवश्यक नहीं है।

क्या इस पर कोई सुझाव है?

धन्यवाद।

उत्तर

16

समस्या का उपयोग आप किस मार्कअप भाषा का उपयोग कर रहे हैं उसके आधार पर अलग-अलग उत्तरों हैं।

यदि आप HTML का उपयोग कर रहे हैं, तो आपको उन संस्थाओं के साथ प्रतिनिधित्व नहीं करना चाहिए क्योंकि स्क्रिप्ट तत्वों को सीडीएटीए युक्त चिह्नित किया गया है।

यदि आप एक्सएचटीएमएल का उपयोग कर रहे हैं, तो आप स्पष्ट सीडीएटीए मार्करों के साथ सीडीएटीए के रूप में उनका प्रतिनिधित्व कर सकते हैं, या आप उन्हें इकाइयों के साथ प्रस्तुत कर सकते हैं।

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

<script type="text/javascript"> 
// <![CDATA[ 
    … 
// ]]> 
</script> 

कुछ समय पहले, मैंने the hows and whys of this के बारे में कुछ लिखा था।

+1

लेकिन फिर भी '>' 'में]]>' अंदर CDATA ब्लॉक '> द्वारा repalced किया जाना चाहिए'। तो 'foo [बार [0]]> 1234' साथ' foo [बार [0]] < 1234' या 'foo [बार [0]]> 1234' बदला जाना चाहिए। अन्यथा सीडीएटीए ब्लॉक समय से बंद हो जाएगा। – Gumbo

+0

चूंकि सीडीएटीए प्रस्तुत करता है और वर्ण "&" और "इकाई का प्रारंभ" नहीं है - जो काम नहीं करेगा। यदि आपको स्ट्रिंग का प्रतिनिधित्व करने की आवश्यकता है "]]>" सीडीएटीए के अंदर तो मुझे पूरा यकीन है कि आप चूसते हैं और (सीडीएटीए ब्लॉक के बाहर) शुरू करने के लिए इकाइयों का उपयोग करना चाहिए – Quentin

+7

या बस एक स्पेस जोड़ें: 'foo [bar [0 ]]> 1234' - या यदि यह एक स्ट्रिंग का हिस्सा है: '' foo [bar [0]] '+'> 1234'' - या बस अपनी सभी स्क्रिप्ट बाहरी .js फ़ाइलों में शामिल करें। – gnarf

13

नहीं, आपको HTML में <script> के अंदर HTML इकाइयों का उपयोग करके < और > से बचना नहीं चाहिए।

  • उपयोग जावास्क्रिप्ट स्ट्रिंग से बचने के नियम (\" साथ \\ साथ \ और " की जगह)
  • और<\/ साथ </ की सभी आवृत्तियां की जगह, <script> तत्व से बाहर भागने को रोकने के लिए।

एक्सएचटीएमएल में यह और अधिक जटिल है।

  • आप एक्सएमएल (रास्ता है कि IE के साथ संगत नहीं है) और CDATA ब्लॉक का उपयोग नहीं करते, तो आप जावास्क्रिप्ट स्ट्रिंग से बचने के अलावा, संस्थाओं से बचने के लिए की जरूरत के रूप में एक्सएचटीएमएल भेजें।
  • यदि आप एक्सएचटीएमएल को एक्सएमएल के रूप में भेजते हैं और सीडीएटीए ब्लॉक का उपयोग करते हैं, तो इकाइयों से बचें नहीं, लेकिन ]]>]]]]><![CDATA[> के साथ इसे से बचने से रोकने के लिए (जावास्क्रिप्ट स्ट्रिंग से बचने के अलावा) को प्रतिस्थापित करें।
  • आप एक्सएचटीएमएल भेज text/html (क्या लोगों के 99% है) तो आप XML CDATA ब्लॉक, एक्सएमएल CDATA बचने और एचटीएमएल ही बार में सभी से बचने के रूप में उपयोग करने के लिए है।
+5

+1। मामूली नाइटपिक: ' ', या'/'संबंधित खुलने वाला टैग खत्म हो जाएगा।] (Http://mths.be/etago) –

2

सस्ता और आसान तरीका:

<script type="text/javascript"> 
    var username = "<%= Encode(UserName) %>"; 
</script> 

जहां Encode में एन्कोडिंग स्कीम जुड़े \xABCD प्रतिनिधित्व जावास्क्रिप्ट के साथ संगत में इनपुट के प्रत्येक चरित्र का अनुवाद करने में है।

एक और सस्ता और आसान तरीका:

<script type="text/javascript"> 
    var username = decodeBase64("<%= EncodeBase64(UserName) %>"); 
</script> 

आप केवल ASCII के साथ काम कर रहे हैं।

बेशक

, pst यह कर के सख्त तरीके के साथ सिर पर कील मारा।

+0

+1 इसके अलावा, इस समाधान आपके आउटपुट स्रोत कोड एच 4x0r देखो बनाता है! –

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