2010-06-02 11 views
6

मुझे आश्चर्य है कि सी # कक्षा या तृतीय पक्ष लाइब्रेरी का कोई भी प्रकार है जो स्क्रिप्ट टैग जैसे खतरनाक पात्रों को हटा देता है?खतरनाक पात्रों को कैसे हटाएं (यानी स्क्रिप्ट टैग)?

मुझे पता है कि आप रेगेक्स का उपयोग कर सकते हैं लेकिन मुझे यह भी पता है कि लोग अपने स्क्रिप्ट टैग लिख सकते हैं ताकि आप सोचने में रेगेक्स को मूर्ख बना सकें।

मैंने यह भी सुना है कि HTML Agility Pack अच्छा है इसलिए मुझे आश्चर्य है कि इसके लिए कोई स्क्रिप्ट हटाने की कक्षा बनाई गई है?

संपादित

http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=24346

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

महान उदाहरण (लगभग), धन्यवाद! जब के साथ लिंक की तलाश में

1) केस-संवेदी खोज का उपयोग करें: कुछ तरीके, यह मजबूत है कि मैंने देखा बनाने के लिए हालांकि "जावास्क्रिप्ट:", "VBScript:", "jscript:"।

<a href="JAVAscRipt:alert('hi')">click> me</a> 

2) किसी भी शैली जिम्मेदार बताते हैं कि एक अभिव्यक्ति नियम शामिल निकालें: उदाहरण के लिए, मूल उदाहरण एचटीएमएल नहीं निकलेगी। इंटरनेट एक्सप्लोरर सीएसएस नियम स्क्रिप्ट के रूप में व्यक्त करता है। उदाहरण के लिए, निम्नलिखित हैं उत्पाद एक संदेश बॉक्स:

<div style="width:expression(alert('hi'));">bad> code</div> 

3) इसके अलावा टैग

को दूर मैं ईमानदारी से पता नहीं क्यों "अभिव्यक्ति" IE से निकाला नहीं गया है - में प्रमुख दोष मेरी राय। ( इंटरनेट एक्सप्लोरर में div उदाहरण देखें और आप देखेंगे कि क्यों - IE8 भी।) I बस उपयोगकर्ता से HTML इनपुट को साफ़ करने के लिए एक आसान/मानक तरीका था।

यहां इन सुधारों के साथ अपडेट किया गया कोड है। अगर आपको कुछ भी गलत लगता है तो मुझे बताएं:

public string ScrubHTML(string html) 
    { 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(html); 

     //Remove potentially harmful elements 
     HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//script|//link|//iframe|//frameset|//frame|//applet|//object|//embed"); 
     if (nc != null) 
     { 
      foreach (HtmlNode node in nc) 
      { 
       node.ParentNode.RemoveChild(node, false); 

      } 
     } 

     //remove hrefs to java/j/vbscript URLs 
     nc = doc.DocumentNode.SelectNodes("//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]"); 
     if (nc != null) 
     { 

      foreach (HtmlNode node in nc) 
      { 
       node.SetAttributeValue("href", "#"); 
      } 
     } 


     //remove img with refs to java/j/vbscript URLs 
     nc = doc.DocumentNode.SelectNodes("//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]"); 
     if (nc != null) 
     { 
      foreach (HtmlNode node in nc) 
      { 
       node.SetAttributeValue("src", "#"); 
      } 
     } 

     //remove on<Event> handlers from all tags 
     nc = doc.DocumentNode.SelectNodes("//*[@onclick or @onmouseover or @onfocus or @onblur or @onmouseout or @ondoubleclick or @onload or @onunload]"); 
     if (nc != null) 
     { 
      foreach (HtmlNode node in nc) 
      { 
       node.Attributes.Remove("onFocus"); 
       node.Attributes.Remove("onBlur"); 
       node.Attributes.Remove("onClick"); 
       node.Attributes.Remove("onMouseOver"); 
       node.Attributes.Remove("onMouseOut"); 
       node.Attributes.Remove("onDoubleClick"); 
       node.Attributes.Remove("onLoad"); 
       node.Attributes.Remove("onUnload"); 
      } 
     } 

     // remove any style attributes that contain the word expression (IE evaluates this as script) 
     nc = doc.DocumentNode.SelectNodes("//*[contains(translate(@style, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'expression')]"); 
     if (nc != null) 
     { 
      foreach (HtmlNode node in nc) 
      { 
       node.Attributes.Remove("stYle"); 
      } 
     } 

     return doc.DocumentNode.WriteTo(); 
    } 
+0

के साथ काम आप उपयोग कर सकते हैं एचटीएमएल भागने समारोह यहाँ उल्लेख की कोशिश कर रहा: http://stackoverflow.com/questions/1005264/escape-text-for-html – phsource

+0

वास्तव में आप क्या करने की कोशिश कर रहे हैं ? क्या आप बस उपयोगकर्ता इनपुट को स्वच्छ करने की कोशिश कर रहे हैं, या आप वेब पृष्ठों को स्क्रैप कर रहे हैं? – womp

+0

खतरनाक टैग को स्वच्छ करें लेकिन अकेले बोल्ड और अन्य समृद्ध HTML टैग जैसे HTML टैग छोड़ दें। – chobo2

उत्तर

-2

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

उदाहरण के लिए, "myString" नामक स्ट्रिंग वैरिएबल के साथ, मैं केवल सुरक्षित होने के लिए हाथ से अलग होने वाले नियमित मैनुअल कैरेक्टर के साथ आरईजीईएक्स चरित्र को अलग कर दूंगा।

यह सब कुछ हटा देगा जो अल्फान्यूमेरिक नहीं है।

myString = Regex.Replace(myString, "[^a-z0-9]", "", RegexOptions.CaseInsensitive); 
myString = myString.replace("/",""); 
myString = myString.replace("<",""); 

आदि

आप "<" और ">" वर्णों के बीच और फिर ">" और "<" के बीच पाठ को हटाकर इसे आगे बढ़ा सकते हैं।

मैं बाहरी तृतीय-पक्ष पुस्तकालयों का उपयोग नहीं करना पसंद करता हूं - मुझे तब तक नहीं करना चाहिए - क्योंकि आपको पुस्तकालय को भी वितरित करना है, आप किसी और के कार्यक्रम पर भरोसा कर रहे हैं ताकि आप सुरक्षित हो सकें, और यदि उनके में भेद्यता हो सॉफ़्टवेयर आपका भी कमजोर है।

+3

दूसरी तरफ यदि मैं किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करता हूं, तो मैं अक्सर किसी समस्या के बारे में पूरी समझ की कमी के कारण अपूर्ण होने के कारण अपूर्ण होने वाले समाधान को कोड करने में कई घंटों खर्च किए बिना अपने समाधान की सभी मजबूती और योग्यता प्राप्त कर सकता हूं। सही तीसरे पक्ष की लाइब्रेरी चुनना एक और सवाल है। – jball

+0

मान्य बिंदु। तीसरे पक्ष के पैकेज के बारे में एक और चिंता यह है कि अगर उस पैकेज को किसी भी बाहरी पुस्तकालयों की आवश्यकता होती है, आदि। तैनाती पर्यावरण निर्दिष्ट नहीं किया गया था, इसलिए आप वास्तव में मान्यताओं के बारे में अनुमान नहीं लगा सकते हैं। लेकिन अगर मैं सैकड़ों मशीनों के साथ एक आईटी विभाग में था, अगर मुझे लाइब्रेरी चलाने के लिए अन्य घटकों के साथ उन सभी मशीनों पर एक तीसरी पार्टी लाइब्रेरी स्थापित करना पड़ा, तो शायद मैं थोड़ा सा बाहर निकलता। तो ..... आपके स्वयं के समाधान बनाम समय बर्बाद हो गया है बनाम समय किसी और के लॉल को तैनात कर दिया गया –

+0

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

1

हमें एक ही समस्या थी: उपयोगकर्ता HTML दर्ज करते हैं और हम इसे अपने एक्सएचटीएमएल पृष्ठों के अंदर प्रदर्शित करना चाहते हैं। ध्यान दें कि वे HTML टुकड़े दर्ज करते हैं और दस्तावेजों को पूरा नहीं करते हैं। मैंने कई अलग-अलग मामलों के परीक्षण के लिए यूनिट परीक्षणों का उपयोग करके 2010 में इस पीठ पर शोध किया था।

समाधान:

  1. उपयोग माइक्रोसॉफ्ट विरोधी क्रॉस साइट स्क्रिप्टिंग लाइब्रेरी सब कुछ माना असुरक्षित (मुख्य रूप से स्क्रिप्ट) हटाने के लिए। ध्यान दें कि यह टूल इन टैग को बंद नहीं करता है: img, घंटा, br और कभी-कभी यह गलत क्रम में टैग बंद करता है।
  2. लगभग वैध एक्सएचटीएमएल बनाने के लिए Tidy.Net का उपयोग करें।
  3. एचटीएमएल, सिर और बॉडी टैग निकालें जो Tidy.Net बनाने के लिए जाता है।
  4. अतिरिक्त लाइन ब्रेक निकालें जो Tidy.Net "pre" टैग के अंदर बनाता है।

यह सभी जेएस को हटा देगा और कुछ मामलों में यह बनायेगा कि ज्यादातर मामलों में वैध एक्सएचटीएमएल टुकड़े हैं। यह सभी स्टाइल टैग भी हटा देगा।

माइक्रोसॉफ्ट विरोधी क्रॉस साइट स्क्रिप्टिंग लाइब्रेरी:

उपकरण मैंने कोशिश की इन समस्याओं है इन टैग बंद नहीं करता है: img, घंटा, br और कभी कभी यह गलत क्रम में टैग बंद कर देता है। दुर्भाग्य से अनुकूलन नहीं है।

Tidy.Net: प्री टैग के अंदर अतिरिक्त लाइन ब्रेक बनाता है। (उपकरण चलाने के बाद मैन्युअल रूप से तय किया जा सकता है।)

टिडीफ़ोरनेट: अस्थिर। कभी-कभी आप "blabla.c में अभिकथन faild" देता है

साफ (सी-DLL) COM आवरण VB6 में किए गए: कम से कम कहना अव्यावहारिक। आपको COM DLL पंजीकृत करना होगा।

एचटीएमएलएगिलिटीपैक: कभी-कभी अतिरिक्त लाइन ब्रेक डालें। पूर्व टैग से लाइन ब्रेक हटा देता है।

Majestic12 HTML-parser: इन टैग को बंद नहीं करता है: img, घंटा, br और कभी-कभी यह गलत क्रम में टैग बंद करता है।

एंटीसामी.Net: इसमें अव्यवहारिक है कि यह जे # में लिखे गए घटकों का उपयोग करता है जो अप्रचलित है। इसके कारण यह 64 बिट वातावरण में नहीं चल सकता है। प्लस तरफ यह टैग और विशेषता मानों को अनुमति देने के लिए बहुत अनुकूलन योग्य है।

0

कैसे Encoder.HtmlEncode?VS 2010 यह पता चलता है जब AntiXss.HtmlEncode

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