2010-01-06 24 views
5

मेरा सी # साइट उपयोगकर्ताओं को साइट पर प्रदर्शित होने के लिए HTML सबमिट करने की अनुमति देती है। मैं HTML के लिए अनुमत टैग और विशेषताओं को सीमित करना चाहता हूं, लेकिन यह पता लगाने में असमर्थ हूं कि .NET में इसे कैसे किया जाए।स्वच्छ उपयोगकर्ता HTML .net

मैंने Html Agility Pack का उपयोग करने का प्रयास किया है, लेकिन मुझे नहीं लगता कि HTML को कैसे संशोधित किया जाए, मैं देख सकता हूं कि HTML के माध्यम से कैसे जाना है और कुछ डेटा ढूंढना है, लेकिन वास्तव में आउटपुट फ़ाइल उत्पन्न करना मुझे परेशान कर रहा है।

क्या किसी के पास HTML में .net को साफ करने के लिए एक अच्छा उदाहरण है? चपलता पैक जवाब हो सकता है, लेकिन दस्तावेज़ीकरण की कमी है।

+0

अच्छा सवाल। यह मेरी सूची के शीर्ष पर है जब भी मैं HTML कोड को सबमिट और प्रदर्शित करने की अनुमति देता हूं - आम तौर पर मैं उन नियंत्रणों का उपयोग करता हूं जो मेरे लिए परिणाम स्वरूपित और स्वच्छ करते हैं (यानी एएसपी.नेट में www.freetextbox.com) लेकिन मुझे वास्तव में परिणाम की पुष्टि करनी चाहिए भी। प्रश्न के लिए +1। – Codesleuth

उत्तर

2

HtmlAgilityPack आप इनपुट से अवांछित टैग हटा सकते हैं के साथ:

node.ParentNode.RemoveChild(node); 
+0

यही वह तरीका है जिसे मैं ढूंढ रहा था। धन्यवाद। – spaetzel

3

आपको केवल अच्छी तरह से बनाए गए HTML को स्वीकार करना चाहिए।

फिर आप LINQ से XML का उपयोग करके विश्लेषण और संशोधित कर सकते हैं।

आप एक रिकर्सिव फ़ंक्शन कर सकते हैं जो उपयोगकर्ता से तत्व लेता है और टैग और विशेषताओं के श्वेतसूची वाले सेट के साथ एक नया तत्व देता है।

उदाहरण के लिए:

//Maps allowed tags to allowed attributes for the tags. 
static readonly Dictionary<string, string[]> AllowedTags = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase) { 
    { "b", new string[0] }, 
    { "img", new string[] { "src", "alt" } }, 
    //... 
}; 
static XElement CleanElement(XElement dirtyElement) { 
    return new XElement(dirtyElem.Name, 
     dirtyElement.Elements 
      .Where(e => AllowedTags.ContainsKey(e.Name)) 
      .Select<XElement, XElement>(CleanElement) 
      .Concat(
       dirtyElement.Attributes 
        .Where(a => AllowedTags[dirtyElem.Name].Contains(a.Name, StringComparer.OrdinalIgnoreCase)) 
      ); 
} 

आप हाइपरलिंक javascript: यूआरएल अस्वीकृत करने के लिए सुनिश्चित करें की अनुमति देते हैं; यह कोड ऐसा नहीं करता है।

+0

+1 नाइस - मुझे "होम-ब्रूड" दृष्टिकोण पसंद है। –

0

एक टूल का उपयोग कर सकते उपलब्ध है SourceForge के बंद SGMLReader जो ठीक से प्रारूपित एक्सएमएल में HTML बदल जाता है और आप के रूप में इसे पढ़ने के लिए अनुमति देता है एक एक्सएमएल रीडर या इसे आगे संसाधित करने के लिए XmlDocument ऑब्जेक्ट में लोड करें। मैंने वेब पृष्ठों को पार्स करने के लिए पहले इसका उपयोग किया है जो हमेशा HTML स्वरूपित नहीं होते हैं।

4

मैं इनपुट को संतृत करने के लिए Microsoft's Anti-XSS Library की दृढ़ता से अनुशंसा करता हूं। यह एचटीएमएल sanitizing का समर्थन करता है।

0

क्या आपने MarkdownSharp पर एक नज़र डाली है जो ओपन सोर्स है और यहां लोगों द्वारा बनाई गई है?

0

जेफ Atwood http://refactormycode.com/codes/333-sanitize-html

पर Refactor मेरे कोड पर अपने श्वेत सूची आधारित दृष्टिकोण तैनात मेरा मानना ​​है कि StackOverflow जोड़ती है कि पदों प्रतिबंध लगाया है और उन्हें प्रदर्शन के लिए तैयार करने के लिए http://refactormycode.com/codes/360-balance-html-tags पर टैग संतुलन कोड के साथ। और, ज़ाहिर है, वे मार्कडाउन सर्प का इस्तेमाल पदों पर मार्कडाउन को सक्षम करने के लिए करते हैं।

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