2010-05-27 12 views
68

मैं .NET 3.5 में MS ScriptManager की RegisterStartUpScript विधि का उपयोग कर क्लाइंट को SQL सर्वर अपवाद के आउटपुट को पास करने का प्रयास कर रहा हूं। यह कुछ त्रुटियों के लिए ठीक काम करता है लेकिन जब अपवाद में सिंगल कोट्स होते हैं तो अलर्ट विफल हो जाता है।क्या एमएस अजाक्स में उपयोग के लिए जावास्क्रिप्ट स्ट्रिंग में .NET स्ट्रिंग को एन्कोड करने का कोई मानक तरीका है?

मैं केवल एकल उद्धरण से बचना नहीं चाहता हूं। जावास्क्रिप्ट में उपयोग के लिए किसी भी विशेष वर्ण से बचने के लिए मैं एक मानक फ़ंक्शन कह सकता हूं?

string scriptstring = "alert('" + ex.Message + "');";   
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alert", scriptstring , true); 

संपादित:

धन्यवाद @tpeczek, कोड लगभग मेरे लिए काम किया :) लेकिन एक मामूली संशोधन (एकल उद्धरण की एस्केपिंग) के साथ यह एक का इलाज काम करता है।

मैं अपने संशोधित संस्करण यहाँ शामिल किया है ...

public class JSEncode 
{ 
    /// <summary> 
    /// Encodes a string to be represented as a string literal. The format 
    /// is essentially a JSON string. 
    /// 
    /// The string returned includes outer quotes 
    /// Example Output: "Hello \"Rick\"!\r\nRock on" 
    /// </summary> 
    /// <param name="s"></param> 
    /// <returns></returns> 
    public static string EncodeJsString(string s) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("\""); 
     foreach (char c in s) 
     { 
      switch (c) 
      { 
       case '\'': 
        sb.Append("\\\'"); 
        break; 
       case '\"': 
        sb.Append("\\\""); 
        break; 
       case '\\': 
        sb.Append("\\\\"); 
        break; 
       case '\b': 
        sb.Append("\\b"); 
        break; 
       case '\f': 
        sb.Append("\\f"); 
        break; 
       case '\n': 
        sb.Append("\\n"); 
        break; 
       case '\r': 
        sb.Append("\\r"); 
        break; 
       case '\t': 
        sb.Append("\\t"); 
        break; 
       default: 
        int i = (int)c; 
        if (i < 32 || i > 127) 
        { 
         sb.AppendFormat("\\u{0:X04}", i); 
        } 
        else 
        { 
         sb.Append(c); 
        } 
        break; 
      } 
     } 
     sb.Append("\""); 

     return sb.ToString(); 
    } 
} 

नीचे उल्लेख किया है - मूल स्रोत: here

उत्तर

9

इस समारोह के साथ एक probem कि यह अक्षर हैं जो आम तौर पर कर रहे हैं एन्कोड नहीं करता है HTML को encapsulating में आउट-ऑफ-बैंड ... यदि आपको एक विशेषता मान के अंदर " के साथ स्ट्रिंग को शामिल करने का प्रयास किया गया है, या यदि आपके पास स्क्रिप्ट तत्व के अंदर अनुक्रम </script> के साथ स्ट्रिंग है तो आपको परेशानी होगी। इससे स्क्रिप्ट इंजेक्शन और एक्सएसएस हो सकता है।

आप जोड़ सकते हैं:

  case '<': 
       sb.Append("\\x3C"); 
       break; 
      case '"': 
       sb.Append("\\x22"); 
       break; 
      case '&': 
       sb.Append("\\x26"); 
       break; 

सामान्य तौर पर यह शायद अपने स्वयं के जे एस स्ट्रिंग शाब्दिक एनकोडर शराब बनाना की तुलना में एक मानक JSON एनकोडर उपयोग करने के लिए बेहतर होगा। यह आपको तारों की बजाय जेएस को किसी भी साधारण डेटाटाइप को पास करने की अनुमति देगा।

.NET 3.5 में आप JavaScriptSerializer मिलता है, लेकिन ध्यान दें कि जबकि इस एनकोड <\u003C के लिए करता है (ताकि उत्पादन उपयुक्त इस्तेमाल के लिए एक <script> तत्व में होगा), यह नहीं एनकोड & या " करता है, इसलिए एट्रिब्यूट वैल्यू में ऐसी सामग्री को शामिल करने के लिए एचटीएमएल-एस्केपिंग की आवश्यकता होगी और एक्सएचटीएमएल स्क्रिप्ट तत्वों के लिए सीडीएटीए रैपर की आवश्यकता होगी।

(कई JSON एनकोडर के साथ आम में, यह भी U + 2028 रेखा विभाजक और U + 2029 पैराग्राफ़ विभाजक वर्ण एन्कोड करने के लिए विफल रहता है। इसके बाद के संस्करण कोड, करता है कारण सभी गैर- ASCII वर्ण से बचने के लिए। इस कारण 'समाप्त नहीं की गई स्ट्रिंग शाब्दिक 'त्रुटियां जब इन वर्णों को जेएस स्ट्रिंग शाब्दिक में शामिल किया जाता है, क्योंकि जावास्क्रिप्ट उन्हें एएससीआईआई न्यूलाइन के समान ही व्यवहार करता है।)

+1

ग्रेट राइट-अप। ध्यान दें कि 'JavaScriptSerializer' एएसपी.NET AJAX 1.0 आउट-ऑफ-बैंड रिलीज के माध्यम से .NET 2 में भी उपलब्ध है (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ca9d90fa-e8c9- 42e3-aa19-08e2c027f5d6 और displaylang = hi)। – bdukes

+0

उस स्थिति में आप संदर्भ के आधार पर 'HttpUtility.HtmlAttributeEncode (HttpUtility.JavaScriptStringEncode (unencodedString)) या 'HttpUtility.HtmlEncode (HttpUtility.JavaScriptStringEncode (unencodedString)) का उपयोग नहीं करेंगे? –

+0

@ मार्टिनब्राउन: आप इनमें से किसी एक का उपयोग जेएस-इन-एचटीएमएल-एट्रिब्यूट में इंजेक्ट करने के लिए कर सकते हैं, हां (हालांकि यह आमतौर पर ऐसा करने का बुरा विचार है)। 'HtmlEncode' और 'HtmlAttributeEncode' विधियों को उत्सुकता से नामित किया गया है; ऐसा लगता है कि किसी को विशेषता मानों के लिए बेहतर काम करना चाहिए और किसी को टेक्स्ट सामग्री के लिए बेहतर काम करना चाहिए, लेकिन संदर्भ संसाधन द्वारा निर्णय लेने में ऐसा कोई भेद नहीं है। वे केवल दो मनमाने ढंग से-अलग-अलग एचटीएमएल एन्कोडर्स हैं। – bobince

163

क्या आपने HttpUtility.JavaScriptStringEncode पर एक नज़र डाली है?

+9

उपरोक्त क्योंकि यह एक महान उत्तर है - केवल .NET 4 में काम करता है हालांकि –

+5

मुझे लगता है कि जब किसी विशिष्ट कार्य (इस तरह) के लिए एक फ्रेमवर्क फ़ंक्शन होता है तो यह अक्सर अपने आप से अधिक विश्वसनीय और सटीक होता है, इसलिए यह इसके साथ बेहतर छड़ी है .. – Luke

+0

क्या 3.5 में ऐसा कोई कामकाज है? –

3

यह एक पुराना धागा है, लेकिन आप माइक्रोसॉफ़्ट एंटीएक्सएसएस लाइब्रेरी के बारे में जानना चाहते हैं जिसमें जावास्क्रिप्ट एन्कोड विधि है जो .Net 2 के लिए काम करती है।

http://msdn.microsoft.com/en-gb/security/aa973814.aspx

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

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